Advertisement
Guest User

LABA SUKA

a guest
Sep 29th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.70 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.         user = self.database.get_user('ADMIN')
  228.         if(user[1]==''):
  229.             self.draw_admin_interface('0')
  230.         else:
  231.             self.draw_admin_interface('1')
  232.  
  233.     def draw_user_interface(self,changed_passw):
  234.         self.mainwindow.geometry('260x250')
  235.         self.clear_window()
  236.         self.report_label = tkinter.Label(self.mainwindow,text='')
  237.         self.report_label.place(x=5,y=10)
  238.         self.current_widgets.append(self.report_label)
  239.         self.exit_btn = tkinter.Button(self.mainwindow,text='Logoff',command = self.draw_login_interface)
  240.         self.exit_btn.place(x=200,y=200)
  241.         self.current_widgets.append(self.exit_btn)
  242.        
  243.         if(changed_passw=='0'):
  244.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  245.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  246.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  247.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  248.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_fpwd)
  249.  
  250.             self.new_pwd_label1.place(x=5,y=65)
  251.             self.new_pwd_label2.place(x=5,y=90)
  252.             self.new_pwd_entry1.place(x=120,y=65)
  253.             self.new_pwd_entry2.place(x=120,y=90)
  254.             self.new_pwd_btn.place(x=5,y=115)
  255.  
  256.             self.current_widgets.append(self.new_pwd_label1)
  257.             self.current_widgets.append(self.new_pwd_label2)
  258.             self.current_widgets.append(self.new_pwd_entry1)
  259.             self.current_widgets.append(self.new_pwd_entry2)
  260.             self.current_widgets.append(self.new_pwd_btn)
  261.         elif(changed_passw=='1'):
  262.             self.old_pwd_label = tkinter.Label(self.mainwindow,text='Old password:')
  263.             self.new_pwd_label1 = tkinter.Label(self.mainwindow,text='New password:')
  264.             self.new_pwd_label2 = tkinter.Label(self.mainwindow,text='Again:')
  265.             self.old_pwd_entry = tkinter.Entry(self.mainwindow,show='*')
  266.             self.new_pwd_entry1 = tkinter.Entry(self.mainwindow,show='*')
  267.             self.new_pwd_entry2 = tkinter.Entry(self.mainwindow,show='*')
  268.             self.new_pwd_btn = tkinter.Button(self.mainwindow,text = 'Change password',command = self.change_pwd)
  269.  
  270.             self.old_pwd_label.place(x=5,y=65)
  271.             self.old_pwd_entry.place(x=120,y=65)
  272.             self.new_pwd_label1.place(x=5,y=90)
  273.             self.new_pwd_label2.place(x=5,y=115)
  274.             self.new_pwd_entry1.place(x=120,y=90)
  275.             self.new_pwd_entry2.place(x=120,y=115)
  276.             self.new_pwd_btn.place(x=5,y=140)
  277.  
  278.             self.current_widgets.append(self.old_pwd_entry)
  279.             self.current_widgets.append(self.old_pwd_label)
  280.             self.current_widgets.append(self.new_pwd_label1)
  281.             self.current_widgets.append(self.new_pwd_label2)
  282.             self.current_widgets.append(self.new_pwd_entry1)
  283.             self.current_widgets.append(self.new_pwd_entry2)
  284.             self.current_widgets.append(self.new_pwd_btn)
  285.  
  286.     def report_bad(self):
  287.         self.report_label['text']='Password insecure'
  288.    
  289.     def toggle_secure(self):
  290.         login = self.users_table.get('active').split('|||')[0]
  291.         user = self.database.get_user(login)
  292.         new_state='1'
  293.         if(user[2]=='0'):
  294.             new_state = '1'
  295.         elif(user[2]=='1'):
  296.             new_state = '0'
  297.         else:
  298.             new_state = '2'
  299.         self.database.set_user_state(login,new_state)
  300.         user = self.database.get_user('ADMIN')
  301.         if(user[1]==''):
  302.             self.draw_admin_interface('0')
  303.         else:
  304.             self.draw_admin_interface('1')
  305.  
  306.     def toggle_block(self):
  307.         login = self.users_table.get('active').split('|||')[0]
  308.         user = self.database.get_user(login)
  309.         new_state='1'
  310.         if(user[2]=='0' or user[2]=='1'):
  311.             new_state = '2'
  312.         else:
  313.             new_state = '0'
  314.         self.database.set_user_state(login,new_state)
  315.         user = self.database.get_user('ADMIN')
  316.         if(user[1]==''):
  317.             self.draw_admin_interface('0')
  318.         else:
  319.             self.draw_admin_interface('1')
  320.  
  321.  
  322.     def change_fpwd(self):
  323.         if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get() and self.curuser=='ADMIN'):
  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('ADMIN',pwd_hash)
  328.             self.draw_admin_interface('1')
  329.         elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()):
  330.             user = self.database.get_user(self.curuser)
  331.             if(user[2]=='0'):
  332.                 if(self.check_pwd(self.new_pwd_entry1.get())==1):
  333.                     hasher = hashlib.md5()
  334.                     hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  335.                     pwd_hash = hasher.hexdigest()
  336.                     self.database.change_password(self.curuser,pwd_hash)
  337.                     self.draw_user_interface('1')
  338.                 else:
  339.                     self.report_bad()
  340.             elif(user[2]=='1'):
  341.                 hasher = hashlib.md5()
  342.                 hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  343.                 pwd_hash = hasher.hexdigest()
  344.                 self.database.change_password(self.curuser,pwd_hash)
  345.                 self.draw_user_interface('1')
  346.        
  347.  
  348.     def change_pwd(self):
  349.         user = self.database.get_user(self.curuser)
  350.         old_pwd_hash = self.database.get_user(self.curuser)[1]
  351.         hasher = hashlib.md5()
  352.         hasher.update(self.old_pwd_entry.get().encode('utf-8'))
  353.         inp_old_pwd_hash = hasher.hexdigest()
  354.         if(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
  355.            and self.curuser=='ADMIN'\
  356.            and old_pwd_hash==inp_old_pwd_hash):
  357.             hasher = hashlib.md5()
  358.             hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  359.             pwd_hash = hasher.hexdigest()
  360.             self.database.change_password('ADMIN',pwd_hash)
  361.             self.draw_admin_interface('1')
  362.         elif(self.new_pwd_entry1.get()==self.new_pwd_entry2.get()\
  363.            and old_pwd_hash==inp_old_pwd_hash):
  364.             if(user[2]=='0'):
  365.                 if(self.check_pwd(self.new_pwd_entry1.get())==1):
  366.                     hasher = hashlib.md5()
  367.                     hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  368.                     pwd_hash = hasher.hexdigest()
  369.                     self.database.change_password(self.curuser,pwd_hash)
  370.                     self.draw_user_interface('1')
  371.                 else:
  372.                     self.report_bad()
  373.             elif(user[2]=='1'):
  374.                 hasher = hashlib.md5()
  375.                 hasher.update(self.new_pwd_entry1.get().encode('utf-8'))
  376.                 pwd_hash = hasher.hexdigest()
  377.                 self.database.change_password(self.curuser,pwd_hash)
  378.                 self.draw_user_interface('1')
  379.        
  380.  
  381.     def check_pwd(self,pwd):
  382.         cyrilic = []
  383.         latin = []
  384.         for i in range(1040,1071):
  385.             cyrilic.append(i)
  386.         for i in range(1072,1103):
  387.             cyrilic.append(i)
  388.         cyrilic.append(1025)
  389.         cyrilic.append(1105)
  390.         for i in range(97,122):
  391.             latin.append(i)
  392.         for i in range(65,90):
  393.             latin.append(i)
  394.         is_cyr = 0
  395.         is_lat = 0
  396.         for i in pwd:
  397.             if(ord(i) in cyrilic):
  398.                 is_cyr=1
  399.             if(ord(i) in latin):
  400.                 is_lat=1
  401.         if(is_cyr==1 and is_lat==1):
  402.             return(1)#okay
  403.         else:
  404.             return(0)#bad
  405.    
  406.     def add_new_user(self):
  407.         login = self.newlogin_entry.get()
  408.         if(self.database.check_login(login)==1):
  409.             self.database.add_user(login,'')
  410.         user = self.database.get_user('ADMIN')
  411.         if(user[1]==''):
  412.             self.draw_admin_interface('0')
  413.         else:
  414.             self.draw_admin_interface('1')
  415.    
  416.     def clear_window(self):
  417.         for i in self.current_widgets:
  418.             i.destroy()
  419.         self.current_widgets = []
  420.    
  421.     def login(self):
  422.         login = self.login_entry.get()
  423.         pwd = self.pwd_entry.get()
  424.         self.login_entry.delete(0,'end')
  425.         self.pwd_entry.delete(0,'end')
  426.         bad = 0
  427.         if(self.database.check_login(login)==0):
  428.             user = self.database.get_user(login)
  429.             if(user[1]=='' and pwd==user[1]):
  430.                 self.curuser=login
  431.                 if(login=='ADMIN'):
  432.                     self.draw_admin_interface('0')
  433.                 else:
  434.                     if(user[2]!='2'):
  435.                         self.draw_user_interface('0')
  436.                     else:
  437.                         bad = 3
  438.             elif(user[1]!=''):
  439.                 hasher = hashlib.md5()
  440.                 hasher.update(pwd.encode('utf-8'))
  441.                 pwd_hash = hasher.hexdigest()
  442.                 if(user[1]==pwd_hash):
  443.                     self.curuser=login
  444.                     if(login=='ADMIN'):
  445.                         self.draw_admin_interface('1')
  446.                     else:
  447.                         if(user[2]!='2'):
  448.                             self.draw_user_interface('1')
  449.                         else:
  450.                             bad = 3
  451.                 else:
  452.                     bad = 1
  453.             else:
  454.                 bad = 1
  455.         else:
  456.             bad = 2
  457.         if(bad!=0):
  458.             if(self.login_fails>=3):
  459.                 exit()
  460.             self.login_fails+=1
  461.             if(bad==1):
  462.                 self.logbox['text']='Wrong password or login'
  463.             elif(bad==2):
  464.                 self.logbox['text']='This login does not exist'
  465.             elif(bad==3):
  466.                 self.logbox['text']='Sorry, your account is blocked'
  467.                    
  468.            
  469.  
  470.        
  471. a = program_windowed()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement