Advertisement
Guest User

LABA_IB

a guest
Sep 29th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.16 KB | None | 0 0
  1. import tkinter,sqlite3,hashlib,random
  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.         self.curuser = ''
  103.         self.mainwindow.geometry('200x170')
  104.         self.login_entry = tkinter.Entry(self.mainwindow)
  105.         self.pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  106.         self.login_label = tkinter.Label(self.mainwindow,text="Login:")
  107.         self.pwd_label = tkinter.Label(self.mainwindow,text="Password:")
  108.         self.login_btn = tkinter.Button(self.mainwindow,text='Login',command=self.login)
  109.         self.logbox = tkinter.Label(self.mainwindow,text='')
  110.         self.about_btn = tkinter.Button(self.mainwindow,text='About..',command = self.about_win)
  111.        
  112.         self.login_label.place(x=5,y=10)
  113.         self.pwd_label.place(x=5,y=35)
  114.         self.login_entry.place(x=70,y=10)
  115.         self.pwd_entry.place(x=70,y=35)
  116.         self.login_btn.place(x=5,y=60)
  117.         self.logbox.place(x=5,y=85)
  118.         self.about_btn.place(x=5,y=120)
  119.  
  120.         self.current_widgets.append(self.login_label)
  121.         self.current_widgets.append(self.pwd_label)
  122.         self.current_widgets.append(self.login_entry)
  123.         self.current_widgets.append(self.pwd_entry)
  124.         self.current_widgets.append(self.login_btn)
  125.         self.current_widgets.append(self.logbox)
  126.         self.current_widgets.append(self.about_btn)
  127.  
  128.     def about_win(self):
  129.         self.aboutwindow = tkinter.Toplevel(self.mainwindow)
  130.         self.aboutwindow.title('About')
  131.         self.amsg=tkinter.Message(self.aboutwindow,text='Зудилов А А, ИДБ-13-10, Вариант 8(содержит кириллицу и латиницу)')
  132.         self.amsg.pack()
  133.  
  134.     def draw_admin_interface(self,changed_passw):
  135.         self.clear_window()
  136.         self.mainwindow.geometry('500x400')
  137.         self.users_table = tkinter.Listbox(self.mainwindow,width=80)
  138.         users = self.database.return_all()
  139.         for user in users:
  140.             blk_text = 'not blocked,password secure'
  141.             pwd = 'no password'
  142.             if(user[2]=='1'):
  143.                 blk_text='not blocked,password insecure'
  144.             if(user[2]=='2'):
  145.                 blk_text='blocked'
  146.             if(user[1]!=''):
  147.                 pwd = user[1]
  148.             ustring = user[0]+'|||'+pwd+'|||'+blk_text
  149.             self.users_table.insert('end',ustring)
  150.         if(changed_passw=='0'):
  151.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  152.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  153.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  154.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  155.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
  156.  
  157.             self.new_pwd_label1.place(x=5,y=265)
  158.             self.new_pwd_label2.place(x=5,y=290)
  159.             self.new_pwd_entry1.place(x=120,y=265)
  160.             self.new_pwd_entry2.place(x=120,y=290)
  161.             self.new_pwd_btn.place(x=5,y=315)
  162.  
  163.             self.current_widgets.append(self.new_pwd_label1)
  164.             self.current_widgets.append(self.new_pwd_label2)
  165.             self.current_widgets.append(self.new_pwd_entry1)
  166.             self.current_widgets.append(self.new_pwd_entry2)
  167.             self.current_widgets.append(self.new_pwd_btn)
  168.         elif(changed_passw=='1'):
  169.             self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
  170.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  171.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  172.             self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  173.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  174.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  175.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
  176.  
  177.             self.old_pwd_label.place(x=5,y=265)
  178.             self.old_pwd_entry.place(x=120,y=265)
  179.             self.new_pwd_label1.place(x=5,y=290)
  180.             self.new_pwd_label2.place(x=5,y=315)
  181.             self.new_pwd_entry1.place(x=120,y=290)
  182.             self.new_pwd_entry2.place(x=120,y=315)
  183.             self.new_pwd_btn.place(x=5,y=340)
  184.  
  185.             self.current_widgets.append(self.old_pwd_entry)
  186.             self.current_widgets.append(self.old_pwd_label)
  187.             self.current_widgets.append(self.new_pwd_label1)
  188.             self.current_widgets.append(self.new_pwd_label2)
  189.             self.current_widgets.append(self.new_pwd_entry1)
  190.             self.current_widgets.append(self.new_pwd_entry2)
  191.             self.current_widgets.append(self.new_pwd_btn)
  192.            
  193.         self.newlogin_label = tkinter.Label(self.mainwindow,text='Login:')
  194.         self.newlogin_entry = tkinter.Entry(self.mainwindow)
  195.         self.newlogin_btn = tkinter.Button(self.mainwindow,text='Add new user',command = self.add_new_user)
  196.         self.toggle_block_btn = tkinter.Button(self.mainwindow,text='Toggle block',command = self.toggle_block)
  197.         self.toggle_secure_btn = tkinter.Button(self.mainwindow,text='Toggle secure',command = self.toggle_secure)
  198.         self.exit_btn = tkinter.Button(self.mainwindow,text='Logoff',command = self.draw_login_interface)
  199.         self.sas_btn = tkinter.Button(self.mainwindow,text='Fill with random users', command = self.fill_users)
  200.  
  201.         self.users_table.place(x=5,y=10)
  202.         self.newlogin_label.place(x=5,y=180)
  203.         self.newlogin_entry.place(x=50,y=180)
  204.         self.newlogin_btn.place(x=5,y=215)
  205.         self.toggle_block_btn.place(x=260,y=180)
  206.         self.toggle_secure_btn.place(x=260,y=215)
  207.         self.exit_btn.place(x=300,y=350)
  208.         self.sas_btn.place(x=300, y= 250)
  209.  
  210.         self.current_widgets.append(self.users_table)
  211.         self.current_widgets.append(self.newlogin_label)
  212.         self.current_widgets.append(self.newlogin_entry)
  213.         self.current_widgets.append(self.newlogin_btn)
  214.         self.current_widgets.append(self.toggle_block_btn)
  215.         self.current_widgets.append(self.toggle_secure_btn)
  216.         self.current_widgets.append(self.exit_btn)
  217.         self.current_widgets.append(self.sas_btn)
  218.  
  219.     def fill_users(self):
  220.         for i in range(0,10):
  221.             name = ''
  222.             for j in range(0,5):
  223.                 new_chr = random.randint(97,122)
  224.                 name+=chr(new_chr)
  225.             if(self.database.check_login(name)==1):
  226.                 self.database.add_user(name,'')
  227.         self.draw_admin_interface('1')
  228.  
  229.     def draw_user_interface(self,changed_passw):
  230.         self.mainwindow.geometry('260x250')
  231.         self.clear_window()
  232.         self.report_label = tkinter.Label(self.mainwindow,text='')
  233.         self.report_label.place(x=5,y=10)
  234.         self.current_widgets.append(self.report_label)
  235.         self.exit_btn = tkinter.Button(self.mainwindow,text='Logoff',command = self.draw_login_interface)
  236.         self.exit_btn.place(x=200,y=200)
  237.         self.current_widgets.append(self.exit_btn)
  238.        
  239.         if(changed_passw=='0'):
  240.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  241.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  242.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  243.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  244.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
  245.  
  246.             self.new_pwd_label1.place(x=5,y=65)
  247.             self.new_pwd_label2.place(x=5,y=90)
  248.             self.new_pwd_entry1.place(x=120,y=65)
  249.             self.new_pwd_entry2.place(x=120,y=90)
  250.             self.new_pwd_btn.place(x=5,y=115)
  251.  
  252.             self.current_widgets.append(self.new_pwd_label1)
  253.             self.current_widgets.append(self.new_pwd_label2)
  254.             self.current_widgets.append(self.new_pwd_entry1)
  255.             self.current_widgets.append(self.new_pwd_entry2)
  256.             self.current_widgets.append(self.new_pwd_btn)
  257.         elif(changed_passw=='1'):
  258.             self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
  259.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  260.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  261.             self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  262.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  263.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  264.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
  265.  
  266.             self.old_pwd_label.place(x=5,y=65)
  267.             self.old_pwd_entry.place(x=120,y=65)
  268.             self.new_pwd_label1.place(x=5,y=90)
  269.             self.new_pwd_label2.place(x=5,y=115)
  270.             self.new_pwd_entry1.place(x=120,y=90)
  271.             self.new_pwd_entry2.place(x=120,y=115)
  272.             self.new_pwd_btn.place(x=5,y=140)
  273.  
  274.             self.current_widgets.append(self.old_pwd_entry)
  275.             self.current_widgets.append(self.old_pwd_label)
  276.             self.current_widgets.append(self.new_pwd_label1)
  277.             self.current_widgets.append(self.new_pwd_label2)
  278.             self.current_widgets.append(self.new_pwd_entry1)
  279.             self.current_widgets.append(self.new_pwd_entry2)
  280.             self.current_widgets.append(self.new_pwd_btn)
  281.  
  282.     def report_bad(self):
  283.         self.report_label['text']='Password insecure'
  284.    
  285.     def toggle_secure(self):
  286.         login = self.users_table.get('active').split('|||')[0]
  287.         user = self.database.get_user(login)
  288.         new_state='1'
  289.         if(user[2]=='0'):
  290.             new_state = '1'
  291.         elif(user[2]=='1'):
  292.             new_state = '0'
  293.         else:
  294.             new_state = '2'
  295.         self.database.set_user_state(login,new_state)
  296.         self.draw_admin_interface('1')
  297.  
  298.     def toggle_block(self):
  299.         login = self.users_table.get('active').split('|||')[0]
  300.         user = self.database.get_user(login)
  301.         new_state='1'
  302.         if(user[2]=='0' or user[2]=='1'):
  303.             new_state = '2'
  304.         else:
  305.             new_state = '0'
  306.         self.database.set_user_state(login,new_state)
  307.         self.draw_admin_interface('1')
  308.  
  309.  
  310.     def change_fpwd(self):
  311.         if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get() and self.curuser=='ADMIN'):
  312.             hasher = hashlib.md5()
  313.             hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  314.             pwd_hash = hasher.hexdigest()
  315.             self.database.change_password('ADMIN',pwd_hash)
  316.             self.draw_admin_interface('1')
  317.         elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()):
  318.             user = self.database.get_user(self.curuser)
  319.             if(user[2]=='0'):
  320.                 if(self.check_pwd(self.new_pwd_entry1.get())==1):
  321.                     hasher = hashlib.md5()
  322.                     hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  323.                     pwd_hash = hasher.hexdigest()
  324.                     self.database.change_password(self.curuser,pwd_hash)
  325.                     self.draw_user_interface('1')
  326.                 else:
  327.                     self.report_bad()
  328.             elif(user[2]=='1'):
  329.                 hasher = hashlib.md5()
  330.                 hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  331.                 pwd_hash = hasher.hexdigest()
  332.                 self.database.change_password(self.curuser,pwd_hash)
  333.                 self.draw_user_interface('1')
  334.        
  335.  
  336.     def change_pwd(self):
  337.         user = self.database.get_user(self.curuser)
  338.         old_pwd_hash = self.database.get_user(self.curuser)[1]
  339.         hasher = hashlib.md5()
  340.         hasher.update(self.old_pwd_entry.get().encode('utf-8'))
  341.         inp_old_pwd_hash = hasher.hexdigest()
  342.         if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
  343.            and self.curuser=='ADMIN'\
  344.            and old_pwd_hash==inp_old_pwd_hash):
  345.             hasher = hashlib.md5()
  346.             hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  347.             pwd_hash = hasher.hexdigest()
  348.             self.database.change_password('ADMIN',pwd_hash)
  349.             self.draw_admin_interface('1')
  350.         elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
  351.            and old_pwd_hash==inp_old_pwd_hash):
  352.             if(user[2]=='0'):
  353.                 if(self.check_pwd(self.new_pwd_entry1.get())==1):
  354.                     hasher = hashlib.md5()
  355.                     hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  356.                     pwd_hash = hasher.hexdigest()
  357.                     self.database.change_password(self.curuser,pwd_hash)
  358.                     self.draw_user_interface('1')
  359.                 else:
  360.                     self.report_bad()
  361.             elif(user[2]=='1'):
  362.                 hasher = hashlib.md5()
  363.                 hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  364.                 pwd_hash = hasher.hexdigest()
  365.                 self.database.change_password(self.curuser,pwd_hash)
  366.                 self.draw_user_interface('1')
  367.        
  368.  
  369.     def check_pwd(self,pwd):
  370.         cyrilic = []
  371.         latin = []
  372.         for i in range(1040,1071):
  373.             cyrilic.append(i)
  374.         for i in range(1072,1103):
  375.             cyrilic.append(i)
  376.         cyrilic.append(1025)
  377.         cyrilic.append(1105)
  378.         for i in range(97,122):
  379.             latin.append(i)
  380.         for i in range(65,90):
  381.             latin.append(i)
  382.         is_cyr = 0
  383.         is_lat = 0
  384.         for i in pwd:
  385.             if(ord(i) in cyrilic):
  386.                 is_cyr=1
  387.             if(ord(i) in latin):
  388.                 is_lat=1
  389.         if(is_cyr==1 and is_lat==1):
  390.             return(1)#okay
  391.         else:
  392.             return(0)#bad
  393.    
  394.     def add_new_user(self):
  395.         login = self.newlogin_entry.get()
  396.         if(self.database.check_login(login)==1):
  397.             self.database.add_user(login,'')
  398.         self.draw_admin_interface('1')
  399.    
  400.     def clear_window(self):
  401.         for i in self.current_widgets:
  402.             i.destroy()
  403.         self.current_widgets = []
  404.    
  405.     def login(self):
  406.         login = self.login_entry.get()
  407.         pwd = self.pwd_entry.get()
  408.         self.login_entry.delete(0,'end')
  409.         self.pwd_entry.delete(0,'end')
  410.         bad = 0
  411.         if(self.database.check_login(login)==0):
  412.             user = self.database.get_user(login)
  413.             if(user[1]=='' and pwd==user[1]):
  414.                 self.curuser=login
  415.                 if(login=='ADMIN'):
  416.                     self.draw_admin_interface('0')
  417.                 else:
  418.                     if(user[2]!='2'):
  419.                         self.draw_user_interface('0')
  420.                     else:
  421.                         bad = 3
  422.             elif(user[1]!=''):
  423.                 hasher = hashlib.md5()
  424.                 hasher.update(pwd.encode('utf-8'))
  425.                 pwd_hash = hasher.hexdigest()
  426.                 if(user[1]==pwd_hash):
  427.                     self.curuser=login
  428.                     if(login=='ADMIN'):
  429.                         self.draw_admin_interface('1')
  430.                     else:
  431.                         if(user[2]!='2'):
  432.                             self.draw_user_interface('1')
  433.                         else:
  434.                             bad = 3
  435.                 else:
  436.                     bad = 1
  437.             else:
  438.                 bad = 1
  439.         else:
  440.             bad = 2
  441.         if(bad!=0):
  442.             if(self.login_fails>=3):
  443.                 exit()
  444.             self.login_fails+=1
  445.             if(bad==1):
  446.                 self.logbox['text']='Wrong password or login'
  447.             elif(bad==2):
  448.                 self.logbox['text']='This login does not exist'
  449.             elif(bad==3):
  450.                 self.logbox['text']='Sorry, your account is blocked'
  451.                    
  452.            
  453.  
  454.        
  455. a = program_windowed()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement