Advertisement
Guest User

Untitled

a guest
Sep 27th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.27 KB | None | 0 0
  1. import tkinter,sqlite3,hashlib
  2. class users_database:
  3.     def __init__(self):
  4.         self.dbname = 'users.db'
  5.         connection = sqlite3.connect(self.dbname)
  6.         cursor = connection.cursor()
  7.         if(self.table_exists(cursor)==0):
  8.             cursor.execute("CREATE TABLE users (name text, pwd_h text, blocked text)")
  9.             self.add_admin(cursor)
  10.             connection.commit()
  11.         connection.close()
  12.  
  13.     def table_exists(self,cursor):
  14.         cursor.execute("SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name = 'users'")
  15.         return(cursor.fetchone()[0])
  16.  
  17.     def add_admin(self,cursor):
  18.         cursor.execute("INSERT INTO users VALUES (?,?,?)",("ADMIN","","0"))
  19.  
  20.     #ONLY METHODS LISTED BELOW ARE EXPECTED TO BE CALLED AS OBJECT'S METHODS
  21.     def return_all(self):
  22.         connection = sqlite3.connect(self.dbname)
  23.         cursor = connection.cursor()
  24.         cursor.execute("SELECT * FROM users")
  25.         data = cursor.fetchall()
  26.         connection.close()
  27.         return(data)
  28.    
  29.     def add_user(self,login,pwd_h):
  30.         connection = sqlite3.connect(self.dbname)
  31.         cursor = connection.cursor()
  32.         cursor.execute("INSERT INTO users VALUES (?,?,?)",(login,pwd_h,"0"))
  33.         connection.commit()
  34.         succ = 0
  35.         cursor.execute("SELECT * FROM users WHERE name=?",(login,))
  36.         if(cursor.fetchone()==(login,pwd_h,"0")):
  37.             succ=1
  38.         connection.close()
  39.         return(succ)
  40.  
  41.     def check_login(self,login):
  42.         connection = sqlite3.connect(self.dbname)
  43.         cursor = connection.cursor()
  44.         cursor.execute("SELECT * FROM users WHERE name=?",(login,))
  45.         to_ret = 0
  46.         if(cursor.fetchall()==[]):
  47.             to_ret=1
  48.         connection.close()
  49.         return(to_ret)
  50.  
  51.     def get_user(self,login):
  52.         connection = sqlite3.connect(self.dbname)
  53.         cursor = connection.cursor()
  54.         cursor.execute("SELECT * FROM users WHERE name=?",(login,))
  55.         user = cursor.fetchone()
  56.         connection.close()
  57.         return(user)
  58.    
  59.     def change_password(self,login,pwdh):
  60.         connection = sqlite3.connect(self.dbname)
  61.         cursor = connection.cursor()
  62.         cursor.execute("UPDATE users SET pwd_h = ? WHERE name = ?",(pwdh,login))
  63.         connection.commit()
  64.         succ = 0
  65.         cursor.execute("SELECT pwd_h FROM users WHERE name=?",(login,))
  66.         if(cursor.fetchone()[0]==pwdh):
  67.             succ=1
  68.         connection.close()
  69.         return(succ)
  70.  
  71.     def set_user_state(self,login,state):
  72.         connection = sqlite3.connect(self.dbname)
  73.         cursor = connection.cursor()
  74.         cursor.execute("UPDATE users SET blocked = ? WHERE name = ?",(state,login))
  75.         connection.commit()
  76.         succ = 0
  77.         cursor.execute("SELECT blocked FROM users WHERE name=?",(login,))
  78.         if(cursor.fetchone()[0]==state):
  79.             succ=1
  80.         connection.close()
  81.         return(succ)
  82.    
  83.  
  84.  
  85. class program_windowed:
  86.     def __init__(self):
  87.         self.database = users_database()
  88.         self.curuser = ''
  89.         self.current_widgets = []
  90.         self.login_fails = 0
  91.        
  92.         self.mainwindow=tkinter.Tk()
  93.         self.mainwindow.geometry('600x600')
  94.         self.mainwindow.title("Laba1_IB_ZUDILOW_A_A")
  95.  
  96.         self.draw_login_interface()
  97.        
  98.         self.mainwindow.mainloop()
  99.  
  100.     def draw_login_interface(self):
  101.         self.clear_window()
  102.        
  103.         self.login_entry = tkinter.Entry(self.mainwindow)
  104.         self.pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  105.         self.login_label = tkinter.Label(self.mainwindow,text="Login:")
  106.         self.pwd_label = tkinter.Label(self.mainwindow,text="Password:")
  107.         self.login_btn = tkinter.Button(self.mainwindow,text='Login/Register',command=self.login)
  108.         self.logbox = tkinter.Label(self.mainwindow,text='2')
  109.        
  110.         self.login_label.place(x=5,y=10)
  111.         self.pwd_label.place(x=5,y=35)
  112.         self.login_entry.place(x=70,y=10)
  113.         self.pwd_entry.place(x=70,y=35)
  114.         self.login_btn.place(x=5,y=60)
  115.         self.logbox.place(x=5,y=85)
  116.  
  117.         self.current_widgets.append(self.login_label)
  118.         self.current_widgets.append(self.pwd_label)
  119.         self.current_widgets.append(self.login_entry)
  120.         self.current_widgets.append(self.pwd_entry)
  121.         self.current_widgets.append(self.login_btn)
  122.         self.current_widgets.append(self.logbox)
  123.  
  124.     def draw_admin_interface(self,changed_passw):
  125.         self.clear_window()
  126.         self.users_table = tkinter.Listbox(self.mainwindow,width=80)
  127.         users = self.database.return_all()
  128.         for user in users:
  129.             blk_text = 'not blocked,password secure'
  130.             pwd = 'no password'
  131.             if(user[2]=='1'):
  132.                 blk_text='not blocked,password insecure'
  133.             if(user[2]=='2'):
  134.                 blk_text='blocked'
  135.             if(user[1]!=''):
  136.                 pwd = user[1]
  137.             ustring = user[0]+'|||'+pwd+'|||'+blk_text
  138.             self.users_table.insert('end',ustring)
  139.         if(changed_passw=='0'):
  140.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  141.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  142.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  143.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  144.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
  145.  
  146.             self.new_pwd_label1.place(x=5,y=265)
  147.             self.new_pwd_label2.place(x=5,y=290)
  148.             self.new_pwd_entry1.place(x=120,y=265)
  149.             self.new_pwd_entry2.place(x=120,y=290)
  150.             self.new_pwd_btn.place(x=5,y=315)
  151.  
  152.             self.current_widgets.append(self.new_pwd_label1)
  153.             self.current_widgets.append(self.new_pwd_label2)
  154.             self.current_widgets.append(self.new_pwd_entry1)
  155.             self.current_widgets.append(self.new_pwd_entry2)
  156.             self.current_widgets.append(self.new_pwd_btn)
  157.         elif(changed_passw=='1'):
  158.             self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
  159.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  160.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  161.             self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  162.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  163.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  164.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
  165.  
  166.             self.old_pwd_label.place(x=5,y=265)
  167.             self.old_pwd_entry.place(x=120,y=265)
  168.             self.new_pwd_label1.place(x=5,y=290)
  169.             self.new_pwd_label2.place(x=5,y=315)
  170.             self.new_pwd_entry1.place(x=120,y=290)
  171.             self.new_pwd_entry2.place(x=120,y=315)
  172.             self.new_pwd_btn.place(x=5,y=340)
  173.  
  174.             self.current_widgets.append(self.old_pwd_entry)
  175.             self.current_widgets.append(self.old_pwd_label)
  176.             self.current_widgets.append(self.new_pwd_label1)
  177.             self.current_widgets.append(self.new_pwd_label2)
  178.             self.current_widgets.append(self.new_pwd_entry1)
  179.             self.current_widgets.append(self.new_pwd_entry2)
  180.             self.current_widgets.append(self.new_pwd_btn)
  181.            
  182.         self.newlogin_label = tkinter.Label(self.mainwindow,text='Login:')
  183.         self.newlogin_entry = tkinter.Entry(self.mainwindow)
  184.         self.newlogin_btn = tkinter.Button(self.mainwindow,text='Add new user',command = self.add_new_user)
  185.         self.toggle_block_btn = tkinter.Button(self.mainwindow,text='Toggle block',command = self.toggle_block)
  186.         self.toggle_secure_btn = tkinter.Button(self.mainwindow,text='Toggle secure',command = self.toggle_secure)
  187.  
  188.         self.users_table.place(x=5,y=10)
  189.         self.newlogin_label.place(x=5,y=180)
  190.         self.newlogin_entry.place(x=50,y=180)
  191.         self.newlogin_btn.place(x=5,y=215)
  192.         self.toggle_block_btn.place(x=260,y=180)
  193.         self.toggle_secure_btn.place(x=260,y=215)
  194.  
  195.     def draw_user_interface(self,changed_passw):
  196.         self.mainwindow.geometry('260x200')
  197.         self.clear_window()
  198.         self.report_label = tkinter.Label(self.mainwindow,text='')
  199.         self.report_label.place(x=5,y=10)
  200.         self.current_widgets.append(self.report_label)
  201.         if(changed_passw=='0'):
  202.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  203.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  204.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  205.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  206.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
  207.  
  208.             self.new_pwd_label1.place(x=5,y=65)
  209.             self.new_pwd_label2.place(x=5,y=90)
  210.             self.new_pwd_entry1.place(x=120,y=65)
  211.             self.new_pwd_entry2.place(x=120,y=90)
  212.             self.new_pwd_btn.place(x=5,y=115)
  213.  
  214.             self.current_widgets.append(self.new_pwd_label1)
  215.             self.current_widgets.append(self.new_pwd_label2)
  216.             self.current_widgets.append(self.new_pwd_entry1)
  217.             self.current_widgets.append(self.new_pwd_entry2)
  218.             self.current_widgets.append(self.new_pwd_btn)
  219.         elif(changed_passw=='1'):
  220.             self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
  221.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  222.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  223.             self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  224.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  225.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  226.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
  227.  
  228.             self.old_pwd_label.place(x=5,y=65)
  229.             self.old_pwd_entry.place(x=120,y=65)
  230.             self.new_pwd_label1.place(x=5,y=90)
  231.             self.new_pwd_label2.place(x=5,y=115)
  232.             self.new_pwd_entry1.place(x=120,y=90)
  233.             self.new_pwd_entry2.place(x=120,y=115)
  234.             self.new_pwd_btn.place(x=5,y=140)
  235.  
  236.             self.current_widgets.append(self.old_pwd_entry)
  237.             self.current_widgets.append(self.old_pwd_label)
  238.             self.current_widgets.append(self.new_pwd_label1)
  239.             self.current_widgets.append(self.new_pwd_label2)
  240.             self.current_widgets.append(self.new_pwd_entry1)
  241.             self.current_widgets.append(self.new_pwd_entry2)
  242.             self.current_widgets.append(self.new_pwd_btn)
  243.  
  244.     def report_bad(self):
  245.         self.report_label['text']='Password insecure'
  246.    
  247.     def toggle_secure(self):
  248.         login = self.users_table.get('active').split('|||')[0]
  249.         user = self.database.get_user(login)
  250.         new_state='1'
  251.         if(user[2]=='0'):
  252.             new_state = '1'
  253.         elif(user[2]=='1'):
  254.             new_state = '0'
  255.         else:
  256.             new_state = '2'
  257.         self.database.set_user_state(login,new_state)
  258.         self.draw_admin_interface('1')
  259.  
  260.     def toggle_block(self):
  261.         login = self.users_table.get('active').split('|||')[0]
  262.         user = self.database.get_user(login)
  263.         new_state='1'
  264.         if(user[2]=='0' or user[2]=='1'):
  265.             new_state = '2'
  266.         else:
  267.             new_state = '0'
  268.         self.database.set_user_state(login,new_state)
  269.         self.draw_admin_interface('1')
  270.  
  271.  
  272.     def change_fpwd(self):
  273.         if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get() and self.curuser=='ADMIN'):
  274.             hasher = hashlib.md5()
  275.             hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  276.             pwd_hash = hasher.hexdigest()
  277.             self.database.change_password('ADMIN',pwd_hash)
  278.             self.draw_admin_interface('1')
  279.         elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()):
  280.             user = self.database.get_user(self.curuser)
  281.             if(user[2]=='0'):
  282.                 if(self.check_pwd(self.new_pwd_entry1.get())==1):
  283.                     hasher = hashlib.md5()
  284.                     hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  285.                     pwd_hash = hasher.hexdigest()
  286.                     self.database.change_password(self.curuser,pwd_hash)
  287.                     self.draw_user_interface('1')
  288.                 else:
  289.                     self.report_bad()
  290.             elif(user[2]=='1'):
  291.                 hasher = hashlib.md5()
  292.                 hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  293.                 pwd_hash = hasher.hexdigest()
  294.                 self.database.change_password(self.curuser,pwd_hash)
  295.                 self.draw_user_interface('1')
  296.        
  297.  
  298.     def change_pwd(self):
  299.         user = self.database.get_user(self.curuser)
  300.         old_pwd_hash = self.database.get_user(self.curuser)[1]
  301.         hasher = hashlib.md5()
  302.         hasher.update(self.old_pwd_entry.get().encode('utf-8'))
  303.         inp_old_pwd_hash = hasher.hexdigest()
  304.         if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
  305.            and self.curuser=='ADMIN'\
  306.            and old_pwd_hash==inp_old_pwd_hash):
  307.             hasher = hashlib.md5()
  308.             hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  309.             pwd_hash = hasher.hexdigest()
  310.             self.database.change_password('ADMIN',pwd_hash)
  311.             self.draw_admin_interface('1')
  312.         elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
  313.            and old_pwd_hash==inp_old_pwd_hash):
  314.             if(user[2]=='0'):
  315.                 if(self.check_pwd(self.new_pwd_entry1.get())==1):
  316.                     hasher = hashlib.md5()
  317.                     hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  318.                     pwd_hash = hasher.hexdigest()
  319.                     self.database.change_password(self.curuser,pwd_hash)
  320.                     self.draw_user_interface('1')
  321.                 else:
  322.                     self.report_bad()
  323.             elif(user[2]=='1'):
  324.                 hasher = hashlib.md5()
  325.                 hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  326.                 pwd_hash = hasher.hexdigest()
  327.                 self.database.change_password(self.curuser,pwd_hash)
  328.                 self.draw_user_interface('1')
  329.        
  330.  
  331.     def check_pwd(self,pwd):
  332.         cyrilic = []
  333.         latin = []
  334.         for i in range(1040,1071):
  335.             cyrilic.append(i)
  336.         for i in range(1072,1103):
  337.             cyrilic.append(i)
  338.         cyrilic.append(1025)
  339.         cyrilic.append(1105)
  340.         for i in range(97,122):
  341.             latin.append(i)
  342.         for i in range(65,90):
  343.             latin.append(i)
  344.         is_cyr = 0
  345.         is_lat = 0
  346.         for i in pwd:
  347.             if(ord(i) in cyrilic):
  348.                 is_cyr=1
  349.             if(ord(i) in latin):
  350.                 is_lat=1
  351.         if(is_cyr==1 and is_lat==1):
  352.             return(1)#okay
  353.         else:
  354.             return(0)#bad
  355.    
  356.     def add_new_user(self):
  357.         login = self.newlogin_entry.get()
  358.         if(self.database.check_login(login)==1):
  359.             self.database.add_user(login,'')
  360.         self.draw_admin_interface('1')
  361.    
  362.     def clear_window(self):
  363.         for i in self.current_widgets:
  364.             i.destroy()
  365.         self.current_widgets = []
  366.    
  367.     def login(self):
  368.         login = self.login_entry.get()
  369.         pwd = self.pwd_entry.get()
  370.         self.login_entry.delete(0,'end')
  371.         self.pwd_entry.delete(0,'end')
  372.         bad = 0
  373.         if(self.database.check_login(login)==0):
  374.             user = self.database.get_user(login)
  375.             if(user[1]=='' and pwd==user[1]):
  376.                 self.curuser=login
  377.                 if(login=='ADMIN'):
  378.                     self.draw_admin_interface('0')
  379.                 else:
  380.                     if(user[2]!='2'):
  381.                         self.draw_user_interface('0')
  382.                     else:
  383.                         bad = 3
  384.             elif(user[1]!=''):
  385.                 hasher = hashlib.md5()
  386.                 hasher.update(pwd.encode('utf-8'))
  387.                 pwd_hash = hasher.hexdigest()
  388.                 if(user[1]==pwd_hash):
  389.                     self.curuser=login
  390.                     if(login=='ADMIN'):
  391.                         self.draw_admin_interface('1')
  392.                     else:
  393.                         if(user[2]!='2'):
  394.                             self.draw_user_interface('1')
  395.                         else:
  396.                             bad = 3
  397.                 else:
  398.                     bad = 1
  399.             else:
  400.                 bad = 1
  401.         else:
  402.             bad = 2
  403.         if(bad!=0):
  404.             if(self.login_fails>=3):
  405.                 exit()
  406.             self.login_fails+=1
  407.             if(bad==1):
  408.                 self.logbox['text']='Wrong password or login'
  409.             elif(bad==2):
  410.                 self.logbox['text']='This login does not exist'
  411.             elif(bad==3):
  412.                 self.logbox['text']='Sorry, your account is blocked'
  413.                    
  414.            
  415.  
  416.        
  417. a = program_windowed()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement