Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter,sqlite3,hashlib,random
- class users_database:
- def __init__(self):
- self.dbname = 'users.db'
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- if(self.table_exists(cursor)==0):
- cursor.execute("CREATE TABLE users (name text, pwd_h text, blocked text)")
- self.add_admin(cursor)
- connection.commit()
- connection.close()
- def table_exists(self,cursor):
- cursor.execute("SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name = 'users'")
- return(cursor.fetchone()[0])
- def add_admin(self,cursor):
- cursor.execute("INSERT INTO users VALUES (?,?,?)",("ADMIN","","0"))
- #ONLY METHODS LISTED BELOW ARE EXPECTED TO BE CALLED AS OBJECT'S METHODS
- def return_all(self):
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- cursor.execute("SELECT * FROM users")
- data = cursor.fetchall()
- connection.close()
- return(data)
- def add_user(self,login,pwd_h):
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- cursor.execute("INSERT INTO users VALUES (?,?,?)",(login,pwd_h,"0"))
- connection.commit()
- succ = 0
- cursor.execute("SELECT * FROM users WHERE name=?",(login,))
- if(cursor.fetchone()==(login,pwd_h,"0")):
- succ=1
- connection.close()
- return(succ)
- def check_login(self,login):
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- cursor.execute("SELECT * FROM users WHERE name=?",(login,))
- to_ret = 0
- if(cursor.fetchall()==[]):
- to_ret=1
- connection.close()
- return(to_ret)
- def get_user(self,login):
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- cursor.execute("SELECT * FROM users WHERE name=?",(login,))
- user = cursor.fetchone()
- connection.close()
- return(user)
- def change_password(self,login,pwdh):
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- cursor.execute("UPDATE users SET pwd_h = ? WHERE name = ?",(pwdh,login))
- connection.commit()
- succ = 0
- cursor.execute("SELECT pwd_h FROM users WHERE name=?",(login,))
- if(cursor.fetchone()[0]==pwdh):
- succ=1
- connection.close()
- return(succ)
- def set_user_state(self,login,state):
- connection = sqlite3.connect(self.dbname)
- cursor = connection.cursor()
- cursor.execute("UPDATE users SET blocked = ? WHERE name = ?",(state,login))
- connection.commit()
- succ = 0
- cursor.execute("SELECT blocked FROM users WHERE name=?",(login,))
- if(cursor.fetchone()[0]==state):
- succ=1
- connection.close()
- return(succ)
- class program_windowed:
- def __init__(self):
- self.database = users_database()
- self.curuser = ''
- self.current_widgets = []
- self.login_fails = 0
- self.mainwindow=tkinter.Tk()
- self.mainwindow.geometry('600x600')
- self.mainwindow.title("Laba1_IB_ZUDILOW_A_A")
- self.draw_login_interface()
- self.mainwindow.mainloop()
- def draw_login_interface(self):
- self.clear_window()
- self.curuser = ''
- self.mainwindow.geometry('200x170')
- self.login_entry = tkinter.Entry(self.mainwindow)
- self.pwd_entry = tkinter.Entry(self.mainwindow,show='*')
- self.login_label = tkinter.Label(self.mainwindow,text="Login:")
- self.pwd_label = tkinter.Label(self.mainwindow,text="Password:")
- self.login_btn = tkinter.Button(self.mainwindow,text='Login',command=self.login)
- self.logbox = tkinter.Label(self.mainwindow,text='')
- self.about_btn = tkinter.Button(self.mainwindow,text='About..',command = self.about_win)
- self.login_label.place(x=5,y=10)
- self.pwd_label.place(x=5,y=35)
- self.login_entry.place(x=70,y=10)
- self.pwd_entry.place(x=70,y=35)
- self.login_btn.place(x=5,y=60)
- self.logbox.place(x=5,y=85)
- self.about_btn.place(x=5,y=120)
- self.current_widgets.append(self.login_label)
- self.current_widgets.append(self.pwd_label)
- self.current_widgets.append(self.login_entry)
- self.current_widgets.append(self.pwd_entry)
- self.current_widgets.append(self.login_btn)
- self.current_widgets.append(self.logbox)
- self.current_widgets.append(self.about_btn)
- def about_win(self):
- self.aboutwindow = tkinter.Toplevel(self.mainwindow)
- self.aboutwindow.title('About')
- self.amsg=tkinter.Message(self.aboutwindow,text='Зудилов А А, ИДБ-13-10, Вариант 8(содержит кириллицу и латиницу)')
- self.amsg.pack()
- def draw_admin_interface(self,changed_passw):
- self.clear_window()
- self.mainwindow.geometry('500x400')
- self.users_table = tkinter.Listbox(self.mainwindow,width=80)
- users = self.database.return_all()
- for user in users:
- blk_text = 'not blocked,password secure'
- pwd = 'no password'
- if(user[2]=='1'):
- blk_text='not blocked,password insecure'
- if(user[2]=='2'):
- blk_text='blocked'
- if(user[1]!=''):
- pwd = user[1]
- ustring = user[0]+'|||'+pwd+'|||'+blk_text
- self.users_table.insert('end',ustring)
- if(changed_passw=='0'):
- self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
- self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
- self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
- self.new_pwd_label1.place(x=5,y=265)
- self.new_pwd_label2.place(x=5,y=290)
- self.new_pwd_entry1.place(x=120,y=265)
- self.new_pwd_entry2.place(x=120,y=290)
- self.new_pwd_btn.place(x=5,y=315)
- self.current_widgets.append(self.new_pwd_label1)
- self.current_widgets.append(self.new_pwd_label2)
- self.current_widgets.append(self.new_pwd_entry1)
- self.current_widgets.append(self.new_pwd_entry2)
- self.current_widgets.append(self.new_pwd_btn)
- elif(changed_passw=='1'):
- self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
- self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
- self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
- self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
- self.old_pwd_label.place(x=5,y=265)
- self.old_pwd_entry.place(x=120,y=265)
- self.new_pwd_label1.place(x=5,y=290)
- self.new_pwd_label2.place(x=5,y=315)
- self.new_pwd_entry1.place(x=120,y=290)
- self.new_pwd_entry2.place(x=120,y=315)
- self.new_pwd_btn.place(x=5,y=340)
- self.current_widgets.append(self.old_pwd_entry)
- self.current_widgets.append(self.old_pwd_label)
- self.current_widgets.append(self.new_pwd_label1)
- self.current_widgets.append(self.new_pwd_label2)
- self.current_widgets.append(self.new_pwd_entry1)
- self.current_widgets.append(self.new_pwd_entry2)
- self.current_widgets.append(self.new_pwd_btn)
- self.newlogin_label = tkinter.Label(self.mainwindow,text='Login:')
- self.newlogin_entry = tkinter.Entry(self.mainwindow)
- self.newlogin_btn = tkinter.Button(self.mainwindow,text='Add new user',command = self.add_new_user)
- self.toggle_block_btn = tkinter.Button(self.mainwindow,text='Toggle block',command = self.toggle_block)
- self.toggle_secure_btn = tkinter.Button(self.mainwindow,text='Toggle secure',command = self.toggle_secure)
- self.exit_btn = tkinter.Button(self.mainwindow,text='Logoff',command = self.draw_login_interface)
- self.sas_btn = tkinter.Button(self.mainwindow,text='Fill with random users', command = self.fill_users)
- self.users_table.place(x=5,y=10)
- self.newlogin_label.place(x=5,y=180)
- self.newlogin_entry.place(x=50,y=180)
- self.newlogin_btn.place(x=5,y=215)
- self.toggle_block_btn.place(x=260,y=180)
- self.toggle_secure_btn.place(x=260,y=215)
- self.exit_btn.place(x=300,y=350)
- self.sas_btn.place(x=300, y= 250)
- self.current_widgets.append(self.users_table)
- self.current_widgets.append(self.newlogin_label)
- self.current_widgets.append(self.newlogin_entry)
- self.current_widgets.append(self.newlogin_btn)
- self.current_widgets.append(self.toggle_block_btn)
- self.current_widgets.append(self.toggle_secure_btn)
- self.current_widgets.append(self.exit_btn)
- self.current_widgets.append(self.sas_btn)
- def fill_users(self):
- for i in range(0,10):
- name = ''
- for j in range(0,5):
- new_chr = random.randint(97,122)
- name+=chr(new_chr)
- if(self.database.check_login(name)==1):
- self.database.add_user(name,'')
- user = self.database.get_user('ADMIN')
- if(user[1]==''):
- self.draw_admin_interface('0')
- else:
- self.draw_admin_interface('1')
- def draw_user_interface(self,changed_passw):
- self.mainwindow.geometry('260x250')
- self.clear_window()
- self.report_label = tkinter.Label(self.mainwindow,text='')
- self.report_label.place(x=5,y=10)
- self.current_widgets.append(self.report_label)
- self.exit_btn = tkinter.Button(self.mainwindow,text='Logoff',command = self.draw_login_interface)
- self.exit_btn.place(x=200,y=200)
- self.current_widgets.append(self.exit_btn)
- if(changed_passw=='0'):
- self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
- self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
- self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
- self.new_pwd_label1.place(x=5,y=65)
- self.new_pwd_label2.place(x=5,y=90)
- self.new_pwd_entry1.place(x=120,y=65)
- self.new_pwd_entry2.place(x=120,y=90)
- self.new_pwd_btn.place(x=5,y=115)
- self.current_widgets.append(self.new_pwd_label1)
- self.current_widgets.append(self.new_pwd_label2)
- self.current_widgets.append(self.new_pwd_entry1)
- self.current_widgets.append(self.new_pwd_entry2)
- self.current_widgets.append(self.new_pwd_btn)
- elif(changed_passw=='1'):
- self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
- self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
- self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
- self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
- self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
- self.old_pwd_label.place(x=5,y=65)
- self.old_pwd_entry.place(x=120,y=65)
- self.new_pwd_label1.place(x=5,y=90)
- self.new_pwd_label2.place(x=5,y=115)
- self.new_pwd_entry1.place(x=120,y=90)
- self.new_pwd_entry2.place(x=120,y=115)
- self.new_pwd_btn.place(x=5,y=140)
- self.current_widgets.append(self.old_pwd_entry)
- self.current_widgets.append(self.old_pwd_label)
- self.current_widgets.append(self.new_pwd_label1)
- self.current_widgets.append(self.new_pwd_label2)
- self.current_widgets.append(self.new_pwd_entry1)
- self.current_widgets.append(self.new_pwd_entry2)
- self.current_widgets.append(self.new_pwd_btn)
- def report_bad(self):
- self.report_label['text']='Password insecure'
- def toggle_secure(self):
- login = self.users_table.get('active').split('|||')[0]
- user = self.database.get_user(login)
- new_state='1'
- if(user[2]=='0'):
- new_state = '1'
- elif(user[2]=='1'):
- new_state = '0'
- else:
- new_state = '2'
- self.database.set_user_state(login,new_state)
- user = self.database.get_user('ADMIN')
- if(user[1]==''):
- self.draw_admin_interface('0')
- else:
- self.draw_admin_interface('1')
- def toggle_block(self):
- login = self.users_table.get('active').split('|||')[0]
- user = self.database.get_user(login)
- new_state='1'
- if(user[2]=='0' or user[2]=='1'):
- new_state = '2'
- else:
- new_state = '0'
- self.database.set_user_state(login,new_state)
- user = self.database.get_user('ADMIN')
- if(user[1]==''):
- self.draw_admin_interface('0')
- else:
- self.draw_admin_interface('1')
- def change_fpwd(self):
- if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get() and self.curuser=='ADMIN'):
- hasher = hashlib.md5()
- hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- self.database.change_password('ADMIN',pwd_hash)
- self.draw_admin_interface('1')
- elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()):
- user = self.database.get_user(self.curuser)
- if(user[2]=='0'):
- if(self.check_pwd(self.new_pwd_entry1.get())==1):
- hasher = hashlib.md5()
- hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- self.database.change_password(self.curuser,pwd_hash)
- self.draw_user_interface('1')
- else:
- self.report_bad()
- elif(user[2]=='1'):
- hasher = hashlib.md5()
- hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- self.database.change_password(self.curuser,pwd_hash)
- self.draw_user_interface('1')
- def change_pwd(self):
- user = self.database.get_user(self.curuser)
- old_pwd_hash = self.database.get_user(self.curuser)[1]
- hasher = hashlib.md5()
- hasher.update(self.old_pwd_entry.get().encode('utf-8'))
- inp_old_pwd_hash = hasher.hexdigest()
- if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
- and self.curuser=='ADMIN'\
- and old_pwd_hash==inp_old_pwd_hash):
- hasher = hashlib.md5()
- hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- self.database.change_password('ADMIN',pwd_hash)
- self.draw_admin_interface('1')
- elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
- and old_pwd_hash==inp_old_pwd_hash):
- if(user[2]=='0'):
- if(self.check_pwd(self.new_pwd_entry1.get())==1):
- hasher = hashlib.md5()
- hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- self.database.change_password(self.curuser,pwd_hash)
- self.draw_user_interface('1')
- else:
- self.report_bad()
- elif(user[2]=='1'):
- hasher = hashlib.md5()
- hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- self.database.change_password(self.curuser,pwd_hash)
- self.draw_user_interface('1')
- def check_pwd(self,pwd):
- cyrilic = []
- latin = []
- for i in range(1040,1071):
- cyrilic.append(i)
- for i in range(1072,1103):
- cyrilic.append(i)
- cyrilic.append(1025)
- cyrilic.append(1105)
- for i in range(97,122):
- latin.append(i)
- for i in range(65,90):
- latin.append(i)
- is_cyr = 0
- is_lat = 0
- for i in pwd:
- if(ord(i) in cyrilic):
- is_cyr=1
- if(ord(i) in latin):
- is_lat=1
- if(is_cyr==1 and is_lat==1):
- return(1)#okay
- else:
- return(0)#bad
- def add_new_user(self):
- login = self.newlogin_entry.get()
- if(self.database.check_login(login)==1):
- self.database.add_user(login,'')
- user = self.database.get_user('ADMIN')
- if(user[1]==''):
- self.draw_admin_interface('0')
- else:
- self.draw_admin_interface('1')
- def clear_window(self):
- for i in self.current_widgets:
- i.destroy()
- self.current_widgets = []
- def login(self):
- login = self.login_entry.get()
- pwd = self.pwd_entry.get()
- self.login_entry.delete(0,'end')
- self.pwd_entry.delete(0,'end')
- bad = 0
- if(self.database.check_login(login)==0):
- user = self.database.get_user(login)
- if(user[1]=='' and pwd==user[1]):
- self.curuser=login
- if(login=='ADMIN'):
- self.draw_admin_interface('0')
- else:
- if(user[2]!='2'):
- self.draw_user_interface('0')
- else:
- bad = 3
- elif(user[1]!=''):
- hasher = hashlib.md5()
- hasher.update(pwd.encode('utf-8'))
- pwd_hash = hasher.hexdigest()
- if(user[1]==pwd_hash):
- self.curuser=login
- if(login=='ADMIN'):
- self.draw_admin_interface('1')
- else:
- if(user[2]!='2'):
- self.draw_user_interface('1')
- else:
- bad = 3
- else:
- bad = 1
- else:
- bad = 1
- else:
- bad = 2
- if(bad!=0):
- if(self.login_fails>=3):
- exit()
- self.login_fails+=1
- if(bad==1):
- self.logbox['text']='Wrong password or login'
- elif(bad==2):
- self.logbox['text']='This login does not exist'
- elif(bad==3):
- self.logbox['text']='Sorry, your account is blocked'
- a = program_windowed()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement