X-FTP
[x93.git/.git] / xftp.git / main.py
diff --git a/xftp.git/main.py b/xftp.git/main.py
new file mode 100644 (file)
index 0000000..5aa860f
--- /dev/null
@@ -0,0 +1,768 @@
+# Ftp server\r
+import os,socket\r
+import ext.crud as crud\r
+import time,textwrap\r
+import ext.pyperclip.__init__ as pyperclip\r
+import webbrowser,pickle\r
+import os,subprocess,getpass\r
+import ext.x64.x64_encoding as x64\r
+import io\r
+from ext.pyftpdlib.authorizers import DummyAuthorizer\r
+from ext.pyftpdlib.handlers import FTPHandler\r
+from ext.pyftpdlib.servers import FTPServer\r
+\r
+users_count=0\r
+\r
+def authorizer_def():\r
+       global authorizer\r
+       authorizer = DummyAuthorizer()\r
+authorizer_def()\r
+error=0\r
+\r
+FTP_PORT = 2121\r
+#---------------------------------------------------------------------------------------#\r
+\r
+def ip_def():\r
+       return socket.gethostbyname(socket.gethostname())\r
+       \r
+#---------------------------------------------------------------------------------------#\r
+\r
+def main():\r
+       global server,FTP_DIRECTORY,status,users_count,annonimus\r
+       if users_count==0:\r
+               newuser()\r
+       annonimus=anonim.get()\r
+       newuser()\r
+       handler = FTPHandler\r
+       handler.authorizer = authorizer\r
+       handler.banner = 'Servidor FTP Listo'\r
+       handler.passive_ports = range(60000, 65535)\r
+       address = (ip_var.get(), port.get())\r
+       server = FTPServer(address, handler)\r
+\r
+       server.max_cons = 256\r
+       server.max_cons_per_ip = 5\r
+       save_all()\r
+       \r
+       ftp_name=textwrap.wrap(FTP_DIRECTORY,60)\r
+       ftp_=""\r
+       for i in ftp_name:\r
+               ftp_=ftp_+i+"\n"\r
+\r
+       web=Label(text="ftp://"+ip_var.get()+":"+str(port.get()),relief="sunken",justify="center",bg=color,fg=color2,width=53)\r
+       pyper=Button(text="Copiar",command=lambda:pyperclip.copy("ftp://"+ip_var.get()+":"+str(port.get())),bg=color,fg=color2,overrelief="sunken",width=25)\r
+       pyper2=Button(text="Abrir navegador",command=lambda:webbrowser.open("ftp://"+ip_var.get()+":"+str(port.get())),bg=color,fg=color2,overrelief="sunken",width=25)\r
+       \r
+       root.geometry("620x710")\r
+       pyper.place(x=120,y=620)\r
+       pyper2.place(x=312,y=620)\r
+       web.place(x=120,y=590)\r
+       messagebox.showinfo("Ftp","El servidor inicio correctamente")\r
+       server.serve_forever()\r
+       web.place_forget()\r
+       pyper.place_forget()\r
+       pyper2.place_forget()\r
+       status="off"\r
+       authorizer_def()\r
+       root.geometry("620x610")\r
+       #No se asusten este error es para matar el hilo šŸ¤£šŸ¤£šŸ¤£\r
+       raise(ValueError)\r
+\r
+  \r
+def man():\r
+       try:\r
+               print(ipauth.get(),12)\r
+               if ipauth.get()=="1":\r
+                       ip_var.set(ip_def())\r
+               else:\r
+                       pass\r
+               main()\r
+       except OSError as error:\r
+               if ipauth.get()=="0":\r
+                       messagebox.showwarning("IP","La direcciĆ³n IP que puso ya esta en uso, por favor escriba otra.")\r
+                       print(error)\r
+                       ftp.config(text="Start Ftp-server",command=ftpstart)\r
+               else:\r
+                       port.set(int(port.get())+1)\r
+                       if ip_def()==ip_var.get():\r
+                               man()\r
+                       else:\r
+                               messagebox.showwarning("IP","La direcciĆ³n IP que puso ya esta en uso, por favor escriba otra.")\r
+                               ftp.config(text="Iniciar Servidor",command=ftpstart)\r
+                               main()\r
+                               \r
+\r
+\r
+#---------------------------------------------------------------------------------------#\r
+\r
+from tkinter import Label,Entry,Tk,Button,StringVar,IntVar,Checkbutton,Menu,Spinbox,Menubutton,PhotoImage\r
+from tkinter import messagebox,filedialog\r
+import threading,io\r
+import shutil\r
+\r
+\r
+status=""\r
+\r
+\r
+from ext.color import Color\r
+\r
+\r
+\r
+\r
+def conn():\r
+       global theme2,color,color2,banner,banner1,banner_name2\r
+       try:\r
+               theme=io.open("configs\\themes\\theme.thm","r")\r
+               theme2=theme.readlines()\r
+               print("THEME-NAME: ",theme2[0].rstrip(" \n"))\r
+               color_class=Color(theme2[1].rstrip(" \n"))\r
+               color=color_class.get()\r
+               print(len(color))\r
+               color2_class=Color(theme2[2].rstrip("\n"))\r
+               color2=color2_class.get()\r
+               banner=Color(theme2[3].rstrip("\n"))\r
+               banner1=Color(theme2[4].rstrip("\n"))\r
+               banner=banner.get()\r
+               banner1=banner1.get()\r
+               banner_name2=theme2[5].rstrip("\n")\r
+               theme.close()\r
+               del(theme)\r
+       except ValueError:\r
+               messagebox.showwarning("ColorError","Uno/s color no esta bien escrito")\r
+               ifoff=messagebox.askokcancel("Alerta","Se le restablecera el tema")\r
+               if ifoff==True:\r
+                       theme=io.open("configs\\themes\\theme.thm","w")\r
+                       theme.write("Photoshop-theme\n#5e5c5c\n#ffffff\n#5e5c5c\n#ffffff\nSERVIDOR FTP V10")\r
+               else:\r
+                       pass\r
+       except:\r
+               try:\r
+                       os.mkdir("configs")\r
+               except:\r
+                       pass\r
+               try:\r
+                       os.mkdir("configs\\themes")\r
+               except:\r
+                       pass\r
+               theme=io.open("configs\\themes\\theme.thm","w")\r
+               theme.write("Photoshop-theme\n#5e5c5c\n#ffffff\n#5e5c5c\n#ffffff\nSERVIDOR FTP V10")\r
+               theme.close()\r
+               theme=io.open("configs\\themes\\theme.thm","r")\r
+               theme2=theme.readlines()\r
+               theme.close()\r
+\r
+               color_class=Color(theme2[1].rstrip(" \n"))\r
+               color=color_class.get()\r
+               color2_class=Color(theme2[2].rstrip(" \n"))\r
+               color2=color2_class.get()\r
+               banner=Color(theme2[3].rstrip("\n"))\r
+               banner1=Color(theme2[4].rstrip("\n"))\r
+               banner=banner.get()\r
+               banner1=banner1.get()\r
+               banner_name2=theme2[5].rstrip(" \n")\r
+               del(theme)\r
+               print("THEME-NAME: ",theme2[0].rstrip(" \n"))\r
+conn()\r
+\r
+\r
+\r
+\r
+#color="#bde0e9"\r
+\r
+\r
+\r
+root=Tk()\r
+root.geometry("620x610")\r
+root.config(bg=color)\r
+root.resizable(0,0)\r
+root.title("FTP server")\r
+root.iconbitmap("image\\logo.ico")\r
+\r
+#DEFS\r
+def ftpstart():\r
+       global status,t,FTP_USER,FTP_PASSWORD,FTP_DIRECTORY\r
+       print(1)\r
+       FTP_USER = user.get()\r
+       FTP_PASSWORD = pass2.get()\r
+       FTP_DIRECTORY = directory.get()\r
+       \r
+       ftp.config(text="Parar servidor",command=ftpstop)\r
+       if status=="on":\r
+               pass\r
+       else:\r
+               status="on"\r
+               t=threading.Thread(target=man)\r
+               t.start()\r
+def anonimo():\r
+       if anonim.get()=="1":\r
+               Pass.config(show="A")\r
+               status1.place_forget()\r
+               User.config(show="A")\r
+       else:\r
+               Pass.config(show="")\r
+               status1.place(x=245,y=240)\r
+               t=threading.Thread(target=while_)\r
+               t.start()\r
+               User.config(show="")\r
+def user_auth():\r
+       user.set(getpass.getuser())\r
+def ftpstop():\r
+       global t\r
+       ftp.config(text="Iniciar Servidor",command=ftpstart)\r
+       server.close_all()\r
+       del(t)\r
+       authorizer_def()\r
+def show():\r
+       crud.connect("configs\\cfg.db")\r
+       if show_.get()=="1" and anonim.get()=="0":\r
+               Pass.config(show="")\r
+               crud.update("configs","show","'"+show_.get()+"'","id",1)\r
+       elif show_.get()=="0" and anonim.get()=="0":\r
+               Pass.config(show="*")\r
+               crud.update("configs","show","'"+show_.get()+"'","id",1)\r
+       else:\r
+               if show_.get()=="0":\r
+                       show_.set("1")\r
+               elif show_.get()=="1":\r
+                       show_.set("0")\r
+       crud.save()\r
+       crud.close()\r
+def change():\r
+       global annonimus\r
+       annonimus=anonim.get()\r
+def selecdir():\r
+       dire=filedialog.askdirectory(initial=directory.get())\r
+       if dire=="":\r
+               directory.set(os.getcwd())\r
+               dir()\r
+       else:\r
+               directory.set(dire)\r
+               dir()\r
+def pass_auth_def():\r
+       pass2.set(crud.password(10))\r
+def aut():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_aut",run_open.get(),"id",1)\r
+       crud.save()\r
+       crud.close()\r
+def ann():\r
+       anonimo()\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_ann",anonim.get(),"id",1)\r
+       crud.save()\r
+       change()\r
+       crud.close()\r
+def ip_ch():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_ip","'"+ip_var.get()+"'","id",1)\r
+       crud.save()\r
+       crud.close()\r
+def port_ch():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_port",port.get(),"id",1)\r
+       crud.save()\r
+       crud.close()\r
+def dir():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_dir","'"+directory.get()+"'","id",1)\r
+       crud.save()\r
+       crud.close()\r
+def usr():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_usr","'"+x64.encode_b64_x64(user.get())+"'","id",1)\r
+       crud.save()\r
+       crud.close()\r
+def pss():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_pass","'"+x64.encode_b64_x64(pass2.get())+"'","id",1)\r
+       crud.save()\r
+       crud.close()\r
+\r
+def ip_port_auth():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","cfg_auth","'"+ipauth.get()+"'","id",1)\r
+       crud.save()\r
+       crud.close()\r
+\r
+def save_perm():\r
+       crud.connect("configs\\cfg.db")\r
+       crud.update("configs","perm","'"+perm.get()+"'","id",1)\r
+       crud.save()\r
+       crud.close()\r
+def save_all():\r
+       ip_port_auth()\r
+       ip_ch()\r
+       port_ch()\r
+       dir()\r
+       usr()\r
+       pss()\r
+       save_perm()\r
+def newuser():\r
+       global users_count,FTP_USER,FTP_PASSWORD,FTP_DIRECTORY,annonimus,status\r
+       annonimus=anonim.get()\r
+       print(annonimus)\r
+       FTP_USER = user.get()\r
+       FTP_PASSWORD = pass2.get()\r
+       if FTP_PASSWORD=="":\r
+               sino=messagebox.askokcancel("NoPassword","A puesto una contraseƱa en blanco,\nQuiere que sea creado un usuario anonimo?")\r
+               if sino==True:\r
+                       anonim.set(1)\r
+                       change()\r
+                       pass2.set("admin")\r
+               else:\r
+                       pass2.set("admin")\r
+                       FTP_PASSWORD = pass2.get()\r
+       FTP_DIRECTORY = directory.get()\r
+       if FTP_DIRECTORY=="":\r
+               FTP_DIRECTORY=os.getcwd()\r
+               directory.set(os.getcwd())\r
+       if ip_var.get()=="":\r
+               ipauth.set("on")\r
+               ip_def()\r
+       try:\r
+               if annonimus=="1":\r
+                       authorizer.add_anonymous(FTP_DIRECTORY, perm=perm.get())\r
+                       messagebox.showinfo("Usuario aƱadido","El usuario anonimo fue aƱadido con exito\nPermiso:"+perm.get())\r
+                       users_count=users_count+1\r
+               else:\r
+                       authorizer.add_user(FTP_USER, FTP_PASSWORD, FTP_DIRECTORY, perm=perm.get())\r
+                       messagebox.showinfo("Usuario aƱadido","El usuario "+user.get()+" fue aƱadido con exito\nPermiso:   "+perm.get()+"\n"+"Password: "+"*"*len(pass2.get()))\r
+                       users_count=users_count+1\r
+       except ValueError:\r
+               status="off"\r
+               print("ValueError1")\r
+       save_all()\r
+def remove():\r
+       try:\r
+               authorizer.remove_user(user.get())\r
+               messagebox.showinfo("Sucess!!","El usuario "+user.get()+" ha sido eliminado correctamente")\r
+       except:\r
+               messagebox.showwarning("UserError","El usuario no existe")\r
+def actualizar():\r
+       try:\r
+               authorizer.remove_user(user.get())\r
+               server.close_all()\r
+               authorizer_def()\r
+               newuser()\r
+               ftpstart()\r
+       except:\r
+               messagebox.showwarning("UserError","El usuario no existe")\r
+       \r
+       \r
+def reset():\r
+       ip_var.set(ip_def())\r
+       port.set(2121)\r
+       directory.set(os.getcwd())\r
+       user.set("admin")\r
+       pass2.set("ADMIN999.")\r
+       perm.set("elradfmw")\r
+       run_open.set("0")\r
+       ipauth.set(1)\r
+       show_.set(1)\r
+       anonim.set(0)\r
+       save_all()\r
+def preview():\r
+       global banner_\r
+       conn()\r
+       banner_=banner_name2\r
+       bann()\r
+       del(banner_)\r
+       configure.config(bg=color,fg=color2)\r
+       ftp1.config(bg=color,fg=color2)\r
+       ayuda.config(bg=color,fg=color2)\r
+       b1.config(bg=color,fg=color2)\r
+       b2.config(bg=color,fg=color2)\r
+       b3.config(bg=color,fg=color2)\r
+       b4.config(bg=color,fg=color2)\r
+       b5.config(bg=color,fg=color2)\r
+       b6.config(bg=color,fg=color2)\r
+       b7.config(bg=color,fg=color2)\r
+       b8.config(bg=color,fg=color2)\r
+       #b9.config(bg=color,fg=color2)\r
+\r
+       l1.config(bg=color,fg=color2)\r
+       l2.config(bg=color,fg=color2)\r
+       l3.config(bg=color,fg=color2)\r
+       l4.config(bg=color,fg=color2)\r
+       l5.config(bg=color,fg=color2)\r
+       l6.config(bg=color,fg=color2)\r
+       l7.config(bg=color,fg=color2)\r
+       l8.config(bg=color,fg=color2)\r
+       l9.config(bg=color,fg=color2)\r
+       \r
+       c1.config(bg=color,fg=color2,selectcolor=color)\r
+       c2.config(bg=color,fg=color2,selectcolor=color)\r
+       c3.config(bg=color,fg=color2,selectcolor=color)\r
+       c4.config(bg=color,fg=color2,selectcolor=color)\r
+       ip_ent.config(bg=color,fg=color2)\r
+       Dir.config(bg=color,fg=color2)\r
+       Port.config(bg=color,fg=color2,buttonbackground=color)\r
+       User.config(bg=color,fg=color2)\r
+       Perm.config(bg=color,fg=color2)\r
+       Pass.config(bg=color,fg=color2)\r
+       menu.config(fg=color2,bg=color)\r
+       ftp.config(bg=color,fg=color2)\r
+       Banner.config(bg=banner,fg=banner1,text=b23)\r
+       root.config(bg=color)\r
+       status1.config(bg=color,fg=color2)\r
+def tkinter_config():\r
+       subprocess.Popen(["pythonw","config.pyw"])\r
+       preview()\r
+       #Este error es para matar el hilo no se asusten šŸ¤£\r
+       raise(ValueError)\r
+def tkinter_init():\r
+       t2=threading.Thread(target=tkinter_config)\r
+       t2.start()\r
+\r
+\r
+#Banner\r
+#Clasic theme\r
+#FG-Banner:323836\r
+#BG-Banner:bee2b3.\r
+b23=""\r
+count=0\r
+banner_=banner_name2\r
+def bann():\r
+       global b23\r
+       if len(banner_)<=23 and banner_!="":\r
+               b23=banner_\r
+       else:\r
+               b23="Servidor FTP V11"\r
+bann()\r
+del(banner_)\r
+Banner=Label(text=b23,bg=banner,width=25)\r
+Banner.config(fg=banner1,font=("Army",19))\r
+if len(b23)<=23 and len(b23)>=20:\r
+       Banner.place(x=105,y=40)\r
+elif len(b23)<=20 and len(b23)>16:\r
+       Banner.place(x=100,y=40)\r
+elif len(b23)<=16 and len(b23)>10:\r
+       Banner.place(x=95,y=40)\r
+elif len(b23)<=10 and len(b23)>5:\r
+       Banner.place(x=105,y=40)\r
+elif len(b23)<=5 and len(b23)>3:\r
+       Banner.place(x=105,y=40)\r
+elif len(b23)<=3 and len(b23)>=1:\r
+       Banner.place(x=105,y=40)\r
+del(b23)\r
+del(count)\r
+\r
+#StringVar and IntVar\r
+ip_var=StringVar()\r
+directory=StringVar()  \r
+user=StringVar()\r
+pass2=StringVar()\r
+port=IntVar()\r
+portauth=StringVar()\r
+run_open=StringVar()\r
+anonim=StringVar()\r
+show_=StringVar()\r
+ipauth=StringVar()\r
+perm=StringVar()\r
+#Variables\r
+annonimus=anonim.get()\r
+portauth.set("off")\r
+\r
+def save_an():\r
+       arch=filedialog.asksaveasfile(initialdir=directory.get(),filetypes=(("FTP Config File","*.fcfg"),("Other Config File","*.*")))\r
+       if arch==None:\r
+               pass\r
+       else:\r
+               arch.write(str(ip_var.get())+"\n"+\r
+               str(port.get())+"\n"+\r
+               str(directory.get())+"\n"+\r
+               str(user.get())+"\n"+\r
+               str(pass2.get())+"\n"+\r
+               str(perm.get())+"\n"+\r
+               str(anonim.get())+":"+\r
+               str(show_.get())+":"+\r
+               str(ipauth.get())+":"+\r
+               str(run_open.get()))\r
+\r
+def analsis():\r
+       arch=filedialog.askopenfile(initialdir=directory.get(),filetypes=(("FTP Config File","*.fcfg"),("Other Config File","*.*")))\r
+       if arch==None:\r
+               pass\r
+       else:\r
+               archivo=arch\r
+               archivo=archivo.readlines()\r
+               ip_var.set(archivo[0].split(":")[0])\r
+               port.set(archivo[0].split(":")[1].replace("\n",""))\r
+               directory.set(archivo[1].replace("\n",""))\r
+               user.set(archivo[2].split(":")[0].replace("\n",""))\r
+               pass2.set(archivo[3].replace("\n",""))\r
+               perm.set(archivo[2].split(":")[1].replace("\n",""))\r
+               anonim.set(archivo[4].split(":")[0].replace("\n",""))\r
+               show_.set(archivo[4].split(":")[1].replace("\n",""))\r
+               ipauth.set(archivo[4].split(":")[2].replace("\n",""))\r
+               run_open.set(archivo[4].split(":")[3].replace("\n",""))\r
+\r
+\r
+\r
+#Labels\r
+l1=Label(text="__________________________________________________________________________",justify="left",bg=color,fg=color2)\r
+l1.place(y=310,x=120)\r
+l2=Label(text="__________________________________________________________________________",justify="left",bg=color,fg=color2)\r
+l2.place(y=570,x=120)\r
+l3=Label(text="IP",bg=color,fg=color2)\r
+l3.place(x=170,y=100)\r
+l4=Label(text=":",font=("Arial",15),bg=color,fg=color2)\r
+l4.place(x=362,y=93)\r
+l5=Label(text="P",bg=color,fg=color2)\r
+l5.place(x=357,y=179)\r
+l6=Label(text="Directorio",bg=color,fg=color2)\r
+l6.place(x=170,y=140)\r
+l7=Label(text="User",bg=color,fg=color2)\r
+l7.place(x=170,y=180)\r
+l8=Label(text="Password",bg=color,fg=color2)\r
+l8.place(x=170,y=220)\r
+l9=Label(text="__________________________________________________________________________",justify="left",bg=color,fg=color2)\r
+l9.place(y=395,x=120)\r
+#Checkbuttons\r
+c1=Checkbutton(text="Ejecutar servidor al abrir",variable=run_open,onvalue="1",offvalue="0",command=aut,bg=color,fg=color2,overrelief="sunken",selectcolor=color,anchor="w",width=18)\r
+c1.place(y=370,x=150)\r
+c2=Checkbutton(text="IP y Puerto AutomĆ”ticos",variable=ipauth,onvalue=1,offvalue=0,bg=color,command=ip_port_auth,fg=color2,overrelief="sunken",selectcolor=color,anchor="w",width=18)\r
+c2.place(x=315,y=340)\r
+c3=Checkbutton(text="Mostrar contraseƱa",variable=show_,onvalue=1,offvalue=0,command=show,bg=color,fg=color2,overrelief="sunken",selectcolor=color,anchor="w",width=18)\r
+c3.place(y=370,x=315)  \r
+c4=Checkbutton(text="Anonimo",variable=anonim,onvalue=1,offvalue=0,command=ann,bg=color,fg=color2,overrelief="sunken",selectcolor=color,anchor="w",width=18)\r
+c4.place(y=340,x=150)\r
+#Buttons\r
+ftp=Button(text="Iniciar Servidor",command=ftpstart,bg=color,fg=color2,overrelief="sunken")\r
+ftp.place(x=260,y=280)\r
+b1=Button(text="Seleccionar Directorio",command=lambda:selecdir(),bg=color,fg=color2,width=20,overrelief="sunken")\r
+b1.place(x=155,y=460)\r
+b2=Button(text="Guardar cambios",command=lambda:save_all(),bg=color,fg=color2,width=20,overrelief="sunken")\r
+b2.place(x=155,y=490)\r
+b3=Button(text="AƱadir usuario",command=lambda:newuser(),bg=color,fg=color2,width=20,overrelief="sunken")\r
+b3.place(x=320,y=460)\r
+b4=Button(text="Resetear cambios",command=lambda:reset(),bg=color,fg=color2,width=20,overrelief="sunken")\r
+b4.place(x=320,y=490)\r
+b5=Button(text="Actualizar usuario",command=lambda:actualizar(),bg=color,fg=color2,width=20,overrelief="sunken")\r
+b5.place(x=155,y=520)\r
+b6=Button(text="Eliminar usuario",command=lambda:remove(),bg=color,fg=color2,width=20,overrelief="sunken")\r
+b6.place(x=320,y=520)\r
+b7=Button(text="Usuario de PC",command=user_auth,bg=color,fg=color2,overrelief="sunken",width=20)\r
+b7.place(y=430,x=155)\r
+b8=Button(text="Crear ContraseƱa",command=pass_auth_def,bg=color,fg=color2,overrelief="sunken",width=20)\r
+b8.place(y=430,x=320)\r
+b9=Button(text="Cargar FCFG",command=analsis,bg=color,fg=color2,overrelief="sunken",width=20)\r
+b9.place(y=550,x=155)\r
+b10=Button(text="Exportar FCFG",command=save_an,bg=color,fg=color2,overrelief="sunken",width=20)\r
+b10.place(y=550,x=320)\r
+#Menu\r
+"""\r
+\r
+abc=Menubutton(fg=color2,bg=color,text="Editar",font=("ARial",10))\r
+abc.place(x=0,y=5)\r
+abc1=Menubutton(fg=color2,bg=color,text="Servidor",font=("ARial",10))\r
+abc1.place(x=50,y=5)\r
+abc2=Menubutton(fg=color2,bg=color,text="Ayuda",font=("ARial",10))\r
+abc2.place(x=110,y=5)\r
+\r
+menu=Menu(abc,tearoff=0)\r
+menu1=Menu(abc1,tearoff=0)\r
+menu2=Menu(abc2,tearoff=0)\r
+\r
+\r
+abc.config(menu=menu)\r
+abc1.config(menu=menu1)\r
+abc2.config(menu=menu2)\r
+\r
+menu.config(fg=color2,bg=color)\r
+menu1.config(fg=color2,bg=color)\r
+menu2.config(fg=color2,bg=color)\r
+\r
+configure=Menu(menu,tearoff=0,fg=color2,bg=color)\r
+\r
+#menu.add_cascade(label="Editar",menu=menu)\r
+#ftp1=Menu(menu,tearoff=0,fg=color2,bg=color)\r
+ftp1=menu1\r
+ftp1.add_command(label="Iniciar servidor",command=lambda:ftpstart())\r
+ftp1.add_command(label="Parar servidor",command=lambda:ftpstop())\r
+ftp1.add_separator()\r
+ftp1.add_command(label="Cerrar APP",command=lambda:root.destroy())\r
+#menu.add_cascade(label="Servidor",menu=ftp1)\r
+\r
+#ayuda=Menu(menu,tearoff=0,fg=color2,bg=color)\r
+ayuda=menu2\r
+ayuda.add_command(label="Puntuar app",command=lambda:subprocess.Popen(["pythonw","ext\\puntua.py"]))\r
+ayuda.add_command(label="Acerca de...",command=lambda:subprocess.Popen(["pythonw","ext\\acerca_de.py"]))\r
+ayuda.add_separator()\r
+ayuda.add_command(label="IP",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help.py"]))\r
+ayuda.add_command(label="Directorio",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help1.py"]))\r
+ayuda.add_command(label="Usuario",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help2.py"]))\r
+ayuda.add_command(label="Permisos",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help3.py"]))\r
+#menu.add_cascade(label="Ayuda",menu=ayuda)\r
+menu.add_command(label="ConfiguraciĆ³n",command=tkinter_init)\r
+"""\r
+menu=Menu(root)\r
+menu.config(fg=color2,bg=color)\r
+root.config(menu=menu)\r
+configure=Menu(menu,tearoff=0,fg=color2,bg=color)\r
+menu.add_cascade(label="Editar",menu=configure)\r
+ftp1=Menu(menu,tearoff=0,fg=color2,bg=color)\r
+ftp1.add_command(label="Iniciar servidor",command=lambda:ftpstart())\r
+ftp1.add_command(label="Parar servidor",command=lambda:ftpstop())\r
+ftp1.add_separator()\r
+ftp1.add_command(label="Cerrar APP",command=lambda:root.destroy())\r
+menu.add_cascade(label="Servidor",menu=ftp1)\r
+ayuda=Menu(menu,tearoff=0,fg=color2,bg=color)\r
+ayuda.add_command(label="Puntuar app",command=lambda:subprocess.Popen(["pythonw","ext\\puntua.pyw"]))\r
+ayuda.add_command(label="Acerca de...",command=lambda:subprocess.Popen(["pythonw","ext\\acerca_de.pyw"]))\r
+ayuda.add_separator()\r
+ayuda.add_command(label="IP",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help.pyw"]))\r
+ayuda.add_command(label="Directorio",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help1.pyw"]))\r
+ayuda.add_command(label="Usuario",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help2.pyw"]))\r
+ayuda.add_command(label="Permisos",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help3.pyw"]))\r
+menu.add_cascade(label="Ayuda",menu=ayuda)\r
+configure.add_command(label="ConfiguraciĆ³n",command=tkinter_init)\r
+\r
+ip_ent=Entry(textvariable=ip_var,bg=color,fg=color2,width=16)\r
+Port=Spinbox(justify="center",textvariable=port,width=8,bg=color,fg=color2,to=9999,buttonbackground=color)\r
+Dir=Entry(textvariable=directory,width=29,bg=color,fg=color2)\r
+Dir.place(x=260,y=140)\r
+User=Entry(textvariable=user,width=15,bg=color,justify="center",fg=color2)\r
+Perm=Entry(textvariable=perm,width=10,bg=color,justify="center",fg=color2)\r
+Pass=Entry(textvariable=pass2,width=29,justify="center",bg=color,fg=color2)\r
+Port.place(x=375,y=100)\r
+User.place(x=260,y=180)\r
+Perm.place(x=375,y=180)\r
+ip_ent.place(x=260,y=100)\r
+Pass.place(x=260,y=220)\r
+\r
+status1=Label(text="password",fg=color2,bg=color,width=29,justify="center")\r
+status1.place(x=245,y=240)\r
+pass2_status=""\r
+def while_():\r
+       global pass2_status,pass2\r
+       while True:\r
+               time.sleep(0.5)\r
+               if pass2_status==pass2.get() and anonim.get()=="0":\r
+                       pass\r
+               elif anonim.get()=="1":\r
+                       raise(ValueError)\r
+                       #Este error es para matar el hilo no se asusten šŸ¤£\r
+               else:\r
+                       pass2_status=pass2.get()\r
+                       status1.config(text=crud.check_password_potential(pass2.get()))\r
+t=threading.Thread(target=while_)\r
+t.start()\r
+\r
+#Llamadas a funciones necesarias\r
+\r
+try:\r
+       os.mkdir("configs")\r
+except:\r
+       pass\r
+crud.connect("configs\\cfg.db")\r
+def connect_db():\r
+       try:\r
+               crud.runcode("""CREATE TABLE configs(\r
+               id INTEGER PRIMARY KEY AUTOINCREMENT,\r
+               cfg_aut boolean,\r
+               cfg_ann boolean,\r
+               cfg_ip,\r
+               cfg_port INTEGER,\r
+               cfg_dir,\r
+               cfg_usr,\r
+               cfg_pass,\r
+               show,\r
+               cfg_auth INTEGER,\r
+               perm\r
+               )""")\r
+               \r
+               crud.create("configs","NULL,FALSE,TRUE,'"+ip_def()+"',2121,"+"'"+os.getcwd()+"'"+",'"+x64.encode_b64_x64("admin")+"','"+x64.encode_b64_x64("admin")+"','off',1,'elradfmw'")\r
+               crud.save()\r
+               read_db=crud.read("configs")\r
+               print(read_db)\r
+               b64=read_db[0][6],read_db[0][7]\r
+               b64=x64.decode_list_x64(b64)\r
+\r
+               run_open.set(str(read_db[0][1]))\r
+               anonim.set(str(read_db[0][2]))\r
+\r
+               ip_var.set(read_db[0][3])\r
+\r
+               port.set(read_db[0][4])\r
+\r
+               directory.set(read_db[0][5])\r
+\r
+               user.set(b64[0])\r
+               pass2.set(b64[1])\r
+\r
+               show_.set(read_db[0][8])\r
+\r
+               ipauth.set(read_db[0][9])\r
+\r
+\r
+               perm.set(read_db[0][10])\r
+\r
+               show()\r
+               crud.close()\r
+       except:\r
+               read_db=crud.read("configs")\r
+               print(read_db)\r
+               b64=read_db[0][6],read_db[0][7]\r
+               b64=x64.decode_list_x64(b64)\r
+\r
+               run_open.set(str(read_db[0][1]))\r
+               anonim.set(str(read_db[0][2]))\r
+\r
+               ip_var.set(read_db[0][3])\r
+\r
+               port.set(read_db[0][4])\r
+\r
+               directory.set(read_db[0][5])\r
+\r
+               user.set(b64[0])\r
+               pass2.set(b64[1])\r
+\r
+               show_.set(read_db[0][8])\r
+\r
+               ipauth.set(read_db[0][9])\r
+\r
+\r
+               perm.set(read_db[0][10])\r
+\r
+               show()\r
+               crud.close()\r
+\r
+\r
+\r
+connect_db()\r
+anonimo()\r
+show()\r
+if run_open.get()=="1":\r
+       ftpstart()\r
+else:\r
+       print(run_open.get())\r
+def close_app():\r
+       try:\r
+               ftpstop()\r
+       except:\r
+               pass\r
+       root.destroy()\r
+       anonim.set(1)\r
+       anonimo()\r
+       raise(ValueError)\r
+\r
+class HoverButton(Button):\r
+       def __init__(self, master, **kw):\r
+               Button.__init__(self,master=master,**kw)\r
+               self.defaultBackground = self["background"]\r
+               self.bind("<Enter>", self.on_enter)\r
+               self.bind("<Leave>", self.on_leave)\r
+\r
+       def on_enter(self, e):\r
+               self["background"] = self["activebackground"]\r
+\r
+       def on_leave(self, e):\r
+               self["background"] = self.defaultBackground\r
+\r
+#b9=HoverButton(root,text="x",fg=color2,bg=color,command=close_app,height=1,width=4,font=("Arial",15),relief="flat",overrelief="flat",highlightcolor=Color("red").get(),activebackground=Color("red_strong").get(),activeforeground="#ffffff")\r
+#print(b9.config())\r
+#b9.place(y=0,x=566)\r
+#root.overrideredirect(1)\r
+root.protocol('WM_DELETE_WINDOW',close_app)\r
+root.mainloop()\r