X-FTP
[x93.git/.git] / xftp.git / main.py
1 # Ftp server\r
2 import os,socket\r
3 import ext.crud as crud\r
4 import time,textwrap\r
5 import ext.pyperclip.__init__ as pyperclip\r
6 import webbrowser,pickle\r
7 import os,subprocess,getpass\r
8 import ext.x64.x64_encoding as x64\r
9 import io\r
10 from ext.pyftpdlib.authorizers import DummyAuthorizer\r
11 from ext.pyftpdlib.handlers import FTPHandler\r
12 from ext.pyftpdlib.servers import FTPServer\r
13 \r
14 users_count=0\r
15 \r
16 def authorizer_def():\r
17         global authorizer\r
18         authorizer = DummyAuthorizer()\r
19 authorizer_def()\r
20 error=0\r
21 \r
22 FTP_PORT = 2121\r
23 #---------------------------------------------------------------------------------------#\r
24 \r
25 def ip_def():\r
26         return socket.gethostbyname(socket.gethostname())\r
27         \r
28 #---------------------------------------------------------------------------------------#\r
29 \r
30 def main():\r
31         global server,FTP_DIRECTORY,status,users_count,annonimus\r
32         if users_count==0:\r
33                 newuser()\r
34         annonimus=anonim.get()\r
35         newuser()\r
36         handler = FTPHandler\r
37         handler.authorizer = authorizer\r
38         handler.banner = 'Servidor FTP Listo'\r
39         handler.passive_ports = range(60000, 65535)\r
40         address = (ip_var.get(), port.get())\r
41         server = FTPServer(address, handler)\r
42 \r
43         server.max_cons = 256\r
44         server.max_cons_per_ip = 5\r
45         save_all()\r
46         \r
47         ftp_name=textwrap.wrap(FTP_DIRECTORY,60)\r
48         ftp_=""\r
49         for i in ftp_name:\r
50                 ftp_=ftp_+i+"\n"\r
51 \r
52         web=Label(text="ftp://"+ip_var.get()+":"+str(port.get()),relief="sunken",justify="center",bg=color,fg=color2,width=53)\r
53         pyper=Button(text="Copiar",command=lambda:pyperclip.copy("ftp://"+ip_var.get()+":"+str(port.get())),bg=color,fg=color2,overrelief="sunken",width=25)\r
54         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
55         \r
56         root.geometry("620x710")\r
57         pyper.place(x=120,y=620)\r
58         pyper2.place(x=312,y=620)\r
59         web.place(x=120,y=590)\r
60         messagebox.showinfo("Ftp","El servidor inicio correctamente")\r
61         server.serve_forever()\r
62         web.place_forget()\r
63         pyper.place_forget()\r
64         pyper2.place_forget()\r
65         status="off"\r
66         authorizer_def()\r
67         root.geometry("620x610")\r
68         #No se asusten este error es para matar el hilo šŸ¤£šŸ¤£šŸ¤£\r
69         raise(ValueError)\r
70 \r
71   \r
72 def man():\r
73         try:\r
74                 print(ipauth.get(),12)\r
75                 if ipauth.get()=="1":\r
76                         ip_var.set(ip_def())\r
77                 else:\r
78                         pass\r
79                 main()\r
80         except OSError as error:\r
81                 if ipauth.get()=="0":\r
82                         messagebox.showwarning("IP","La direcciĆ³n IP que puso ya esta en uso, por favor escriba otra.")\r
83                         print(error)\r
84                         ftp.config(text="Start Ftp-server",command=ftpstart)\r
85                 else:\r
86                         port.set(int(port.get())+1)\r
87                         if ip_def()==ip_var.get():\r
88                                 man()\r
89                         else:\r
90                                 messagebox.showwarning("IP","La direcciĆ³n IP que puso ya esta en uso, por favor escriba otra.")\r
91                                 ftp.config(text="Iniciar Servidor",command=ftpstart)\r
92                                 main()\r
93                                 \r
94 \r
95 \r
96 #---------------------------------------------------------------------------------------#\r
97 \r
98 from tkinter import Label,Entry,Tk,Button,StringVar,IntVar,Checkbutton,Menu,Spinbox,Menubutton,PhotoImage\r
99 from tkinter import messagebox,filedialog\r
100 import threading,io\r
101 import shutil\r
102 \r
103 \r
104 status=""\r
105 \r
106 \r
107 from ext.color import Color\r
108 \r
109 \r
110 \r
111 \r
112 def conn():\r
113         global theme2,color,color2,banner,banner1,banner_name2\r
114         try:\r
115                 theme=io.open("configs\\themes\\theme.thm","r")\r
116                 theme2=theme.readlines()\r
117                 print("THEME-NAME: ",theme2[0].rstrip(" \n"))\r
118                 color_class=Color(theme2[1].rstrip(" \n"))\r
119                 color=color_class.get()\r
120                 print(len(color))\r
121                 color2_class=Color(theme2[2].rstrip("\n"))\r
122                 color2=color2_class.get()\r
123                 banner=Color(theme2[3].rstrip("\n"))\r
124                 banner1=Color(theme2[4].rstrip("\n"))\r
125                 banner=banner.get()\r
126                 banner1=banner1.get()\r
127                 banner_name2=theme2[5].rstrip("\n")\r
128                 theme.close()\r
129                 del(theme)\r
130         except ValueError:\r
131                 messagebox.showwarning("ColorError","Uno/s color no esta bien escrito")\r
132                 ifoff=messagebox.askokcancel("Alerta","Se le restablecera el tema")\r
133                 if ifoff==True:\r
134                         theme=io.open("configs\\themes\\theme.thm","w")\r
135                         theme.write("Photoshop-theme\n#5e5c5c\n#ffffff\n#5e5c5c\n#ffffff\nSERVIDOR FTP V10")\r
136                 else:\r
137                         pass\r
138         except:\r
139                 try:\r
140                         os.mkdir("configs")\r
141                 except:\r
142                         pass\r
143                 try:\r
144                         os.mkdir("configs\\themes")\r
145                 except:\r
146                         pass\r
147                 theme=io.open("configs\\themes\\theme.thm","w")\r
148                 theme.write("Photoshop-theme\n#5e5c5c\n#ffffff\n#5e5c5c\n#ffffff\nSERVIDOR FTP V10")\r
149                 theme.close()\r
150                 theme=io.open("configs\\themes\\theme.thm","r")\r
151                 theme2=theme.readlines()\r
152                 theme.close()\r
153 \r
154                 color_class=Color(theme2[1].rstrip(" \n"))\r
155                 color=color_class.get()\r
156                 color2_class=Color(theme2[2].rstrip(" \n"))\r
157                 color2=color2_class.get()\r
158                 banner=Color(theme2[3].rstrip("\n"))\r
159                 banner1=Color(theme2[4].rstrip("\n"))\r
160                 banner=banner.get()\r
161                 banner1=banner1.get()\r
162                 banner_name2=theme2[5].rstrip(" \n")\r
163                 del(theme)\r
164                 print("THEME-NAME: ",theme2[0].rstrip(" \n"))\r
165 conn()\r
166 \r
167 \r
168 \r
169 \r
170 #color="#bde0e9"\r
171 \r
172 \r
173 \r
174 root=Tk()\r
175 root.geometry("620x610")\r
176 root.config(bg=color)\r
177 root.resizable(0,0)\r
178 root.title("FTP server")\r
179 root.iconbitmap("image\\logo.ico")\r
180 \r
181 #DEFS\r
182 def ftpstart():\r
183         global status,t,FTP_USER,FTP_PASSWORD,FTP_DIRECTORY\r
184         print(1)\r
185         FTP_USER = user.get()\r
186         FTP_PASSWORD = pass2.get()\r
187         FTP_DIRECTORY = directory.get()\r
188         \r
189         ftp.config(text="Parar servidor",command=ftpstop)\r
190         if status=="on":\r
191                 pass\r
192         else:\r
193                 status="on"\r
194                 t=threading.Thread(target=man)\r
195                 t.start()\r
196 def anonimo():\r
197         if anonim.get()=="1":\r
198                 Pass.config(show="A")\r
199                 status1.place_forget()\r
200                 User.config(show="A")\r
201         else:\r
202                 Pass.config(show="")\r
203                 status1.place(x=245,y=240)\r
204                 t=threading.Thread(target=while_)\r
205                 t.start()\r
206                 User.config(show="")\r
207 def user_auth():\r
208         user.set(getpass.getuser())\r
209 def ftpstop():\r
210         global t\r
211         ftp.config(text="Iniciar Servidor",command=ftpstart)\r
212         server.close_all()\r
213         del(t)\r
214         authorizer_def()\r
215 def show():\r
216         crud.connect("configs\\cfg.db")\r
217         if show_.get()=="1" and anonim.get()=="0":\r
218                 Pass.config(show="")\r
219                 crud.update("configs","show","'"+show_.get()+"'","id",1)\r
220         elif show_.get()=="0" and anonim.get()=="0":\r
221                 Pass.config(show="*")\r
222                 crud.update("configs","show","'"+show_.get()+"'","id",1)\r
223         else:\r
224                 if show_.get()=="0":\r
225                         show_.set("1")\r
226                 elif show_.get()=="1":\r
227                         show_.set("0")\r
228         crud.save()\r
229         crud.close()\r
230 def change():\r
231         global annonimus\r
232         annonimus=anonim.get()\r
233 def selecdir():\r
234         dire=filedialog.askdirectory(initial=directory.get())\r
235         if dire=="":\r
236                 directory.set(os.getcwd())\r
237                 dir()\r
238         else:\r
239                 directory.set(dire)\r
240                 dir()\r
241 def pass_auth_def():\r
242         pass2.set(crud.password(10))\r
243 def aut():\r
244         crud.connect("configs\\cfg.db")\r
245         crud.update("configs","cfg_aut",run_open.get(),"id",1)\r
246         crud.save()\r
247         crud.close()\r
248 def ann():\r
249         anonimo()\r
250         crud.connect("configs\\cfg.db")\r
251         crud.update("configs","cfg_ann",anonim.get(),"id",1)\r
252         crud.save()\r
253         change()\r
254         crud.close()\r
255 def ip_ch():\r
256         crud.connect("configs\\cfg.db")\r
257         crud.update("configs","cfg_ip","'"+ip_var.get()+"'","id",1)\r
258         crud.save()\r
259         crud.close()\r
260 def port_ch():\r
261         crud.connect("configs\\cfg.db")\r
262         crud.update("configs","cfg_port",port.get(),"id",1)\r
263         crud.save()\r
264         crud.close()\r
265 def dir():\r
266         crud.connect("configs\\cfg.db")\r
267         crud.update("configs","cfg_dir","'"+directory.get()+"'","id",1)\r
268         crud.save()\r
269         crud.close()\r
270 def usr():\r
271         crud.connect("configs\\cfg.db")\r
272         crud.update("configs","cfg_usr","'"+x64.encode_b64_x64(user.get())+"'","id",1)\r
273         crud.save()\r
274         crud.close()\r
275 def pss():\r
276         crud.connect("configs\\cfg.db")\r
277         crud.update("configs","cfg_pass","'"+x64.encode_b64_x64(pass2.get())+"'","id",1)\r
278         crud.save()\r
279         crud.close()\r
280 \r
281 def ip_port_auth():\r
282         crud.connect("configs\\cfg.db")\r
283         crud.update("configs","cfg_auth","'"+ipauth.get()+"'","id",1)\r
284         crud.save()\r
285         crud.close()\r
286 \r
287 def save_perm():\r
288         crud.connect("configs\\cfg.db")\r
289         crud.update("configs","perm","'"+perm.get()+"'","id",1)\r
290         crud.save()\r
291         crud.close()\r
292 def save_all():\r
293         ip_port_auth()\r
294         ip_ch()\r
295         port_ch()\r
296         dir()\r
297         usr()\r
298         pss()\r
299         save_perm()\r
300 def newuser():\r
301         global users_count,FTP_USER,FTP_PASSWORD,FTP_DIRECTORY,annonimus,status\r
302         annonimus=anonim.get()\r
303         print(annonimus)\r
304         FTP_USER = user.get()\r
305         FTP_PASSWORD = pass2.get()\r
306         if FTP_PASSWORD=="":\r
307                 sino=messagebox.askokcancel("NoPassword","A puesto una contraseƱa en blanco,\nQuiere que sea creado un usuario anonimo?")\r
308                 if sino==True:\r
309                         anonim.set(1)\r
310                         change()\r
311                         pass2.set("admin")\r
312                 else:\r
313                         pass2.set("admin")\r
314                         FTP_PASSWORD = pass2.get()\r
315         FTP_DIRECTORY = directory.get()\r
316         if FTP_DIRECTORY=="":\r
317                 FTP_DIRECTORY=os.getcwd()\r
318                 directory.set(os.getcwd())\r
319         if ip_var.get()=="":\r
320                 ipauth.set("on")\r
321                 ip_def()\r
322         try:\r
323                 if annonimus=="1":\r
324                         authorizer.add_anonymous(FTP_DIRECTORY, perm=perm.get())\r
325                         messagebox.showinfo("Usuario aƱadido","El usuario anonimo fue aƱadido con exito\nPermiso:"+perm.get())\r
326                         users_count=users_count+1\r
327                 else:\r
328                         authorizer.add_user(FTP_USER, FTP_PASSWORD, FTP_DIRECTORY, perm=perm.get())\r
329                         messagebox.showinfo("Usuario aƱadido","El usuario "+user.get()+" fue aƱadido con exito\nPermiso:   "+perm.get()+"\n"+"Password: "+"*"*len(pass2.get()))\r
330                         users_count=users_count+1\r
331         except ValueError:\r
332                 status="off"\r
333                 print("ValueError1")\r
334         save_all()\r
335 def remove():\r
336         try:\r
337                 authorizer.remove_user(user.get())\r
338                 messagebox.showinfo("Sucess!!","El usuario "+user.get()+" ha sido eliminado correctamente")\r
339         except:\r
340                 messagebox.showwarning("UserError","El usuario no existe")\r
341 def actualizar():\r
342         try:\r
343                 authorizer.remove_user(user.get())\r
344                 server.close_all()\r
345                 authorizer_def()\r
346                 newuser()\r
347                 ftpstart()\r
348         except:\r
349                 messagebox.showwarning("UserError","El usuario no existe")\r
350         \r
351         \r
352 def reset():\r
353         ip_var.set(ip_def())\r
354         port.set(2121)\r
355         directory.set(os.getcwd())\r
356         user.set("admin")\r
357         pass2.set("ADMIN999.")\r
358         perm.set("elradfmw")\r
359         run_open.set("0")\r
360         ipauth.set(1)\r
361         show_.set(1)\r
362         anonim.set(0)\r
363         save_all()\r
364 def preview():\r
365         global banner_\r
366         conn()\r
367         banner_=banner_name2\r
368         bann()\r
369         del(banner_)\r
370         configure.config(bg=color,fg=color2)\r
371         ftp1.config(bg=color,fg=color2)\r
372         ayuda.config(bg=color,fg=color2)\r
373         b1.config(bg=color,fg=color2)\r
374         b2.config(bg=color,fg=color2)\r
375         b3.config(bg=color,fg=color2)\r
376         b4.config(bg=color,fg=color2)\r
377         b5.config(bg=color,fg=color2)\r
378         b6.config(bg=color,fg=color2)\r
379         b7.config(bg=color,fg=color2)\r
380         b8.config(bg=color,fg=color2)\r
381         #b9.config(bg=color,fg=color2)\r
382 \r
383         l1.config(bg=color,fg=color2)\r
384         l2.config(bg=color,fg=color2)\r
385         l3.config(bg=color,fg=color2)\r
386         l4.config(bg=color,fg=color2)\r
387         l5.config(bg=color,fg=color2)\r
388         l6.config(bg=color,fg=color2)\r
389         l7.config(bg=color,fg=color2)\r
390         l8.config(bg=color,fg=color2)\r
391         l9.config(bg=color,fg=color2)\r
392         \r
393         c1.config(bg=color,fg=color2,selectcolor=color)\r
394         c2.config(bg=color,fg=color2,selectcolor=color)\r
395         c3.config(bg=color,fg=color2,selectcolor=color)\r
396         c4.config(bg=color,fg=color2,selectcolor=color)\r
397         ip_ent.config(bg=color,fg=color2)\r
398         Dir.config(bg=color,fg=color2)\r
399         Port.config(bg=color,fg=color2,buttonbackground=color)\r
400         User.config(bg=color,fg=color2)\r
401         Perm.config(bg=color,fg=color2)\r
402         Pass.config(bg=color,fg=color2)\r
403         menu.config(fg=color2,bg=color)\r
404         ftp.config(bg=color,fg=color2)\r
405         Banner.config(bg=banner,fg=banner1,text=b23)\r
406         root.config(bg=color)\r
407         status1.config(bg=color,fg=color2)\r
408 def tkinter_config():\r
409         subprocess.Popen(["pythonw","config.pyw"])\r
410         preview()\r
411         #Este error es para matar el hilo no se asusten šŸ¤£\r
412         raise(ValueError)\r
413 def tkinter_init():\r
414         t2=threading.Thread(target=tkinter_config)\r
415         t2.start()\r
416 \r
417 \r
418 #Banner\r
419 #Clasic theme\r
420 #FG-Banner:323836\r
421 #BG-Banner:bee2b3.\r
422 b23=""\r
423 count=0\r
424 banner_=banner_name2\r
425 def bann():\r
426         global b23\r
427         if len(banner_)<=23 and banner_!="":\r
428                 b23=banner_\r
429         else:\r
430                 b23="Servidor FTP V11"\r
431 bann()\r
432 del(banner_)\r
433 Banner=Label(text=b23,bg=banner,width=25)\r
434 Banner.config(fg=banner1,font=("Army",19))\r
435 if len(b23)<=23 and len(b23)>=20:\r
436         Banner.place(x=105,y=40)\r
437 elif len(b23)<=20 and len(b23)>16:\r
438         Banner.place(x=100,y=40)\r
439 elif len(b23)<=16 and len(b23)>10:\r
440         Banner.place(x=95,y=40)\r
441 elif len(b23)<=10 and len(b23)>5:\r
442         Banner.place(x=105,y=40)\r
443 elif len(b23)<=5 and len(b23)>3:\r
444         Banner.place(x=105,y=40)\r
445 elif len(b23)<=3 and len(b23)>=1:\r
446         Banner.place(x=105,y=40)\r
447 del(b23)\r
448 del(count)\r
449 \r
450 #StringVar and IntVar\r
451 ip_var=StringVar()\r
452 directory=StringVar()  \r
453 user=StringVar()\r
454 pass2=StringVar()\r
455 port=IntVar()\r
456 portauth=StringVar()\r
457 run_open=StringVar()\r
458 anonim=StringVar()\r
459 show_=StringVar()\r
460 ipauth=StringVar()\r
461 perm=StringVar()\r
462 #Variables\r
463 annonimus=anonim.get()\r
464 portauth.set("off")\r
465 \r
466 def save_an():\r
467         arch=filedialog.asksaveasfile(initialdir=directory.get(),filetypes=(("FTP Config File","*.fcfg"),("Other Config File","*.*")))\r
468         if arch==None:\r
469                 pass\r
470         else:\r
471                 arch.write(str(ip_var.get())+"\n"+\r
472                 str(port.get())+"\n"+\r
473                 str(directory.get())+"\n"+\r
474                 str(user.get())+"\n"+\r
475                 str(pass2.get())+"\n"+\r
476                 str(perm.get())+"\n"+\r
477                 str(anonim.get())+":"+\r
478                 str(show_.get())+":"+\r
479                 str(ipauth.get())+":"+\r
480                 str(run_open.get()))\r
481 \r
482 def analsis():\r
483         arch=filedialog.askopenfile(initialdir=directory.get(),filetypes=(("FTP Config File","*.fcfg"),("Other Config File","*.*")))\r
484         if arch==None:\r
485                 pass\r
486         else:\r
487                 archivo=arch\r
488                 archivo=archivo.readlines()\r
489                 ip_var.set(archivo[0].split(":")[0])\r
490                 port.set(archivo[0].split(":")[1].replace("\n",""))\r
491                 directory.set(archivo[1].replace("\n",""))\r
492                 user.set(archivo[2].split(":")[0].replace("\n",""))\r
493                 pass2.set(archivo[3].replace("\n",""))\r
494                 perm.set(archivo[2].split(":")[1].replace("\n",""))\r
495                 anonim.set(archivo[4].split(":")[0].replace("\n",""))\r
496                 show_.set(archivo[4].split(":")[1].replace("\n",""))\r
497                 ipauth.set(archivo[4].split(":")[2].replace("\n",""))\r
498                 run_open.set(archivo[4].split(":")[3].replace("\n",""))\r
499 \r
500 \r
501 \r
502 #Labels\r
503 l1=Label(text="__________________________________________________________________________",justify="left",bg=color,fg=color2)\r
504 l1.place(y=310,x=120)\r
505 l2=Label(text="__________________________________________________________________________",justify="left",bg=color,fg=color2)\r
506 l2.place(y=570,x=120)\r
507 l3=Label(text="IP",bg=color,fg=color2)\r
508 l3.place(x=170,y=100)\r
509 l4=Label(text=":",font=("Arial",15),bg=color,fg=color2)\r
510 l4.place(x=362,y=93)\r
511 l5=Label(text="P",bg=color,fg=color2)\r
512 l5.place(x=357,y=179)\r
513 l6=Label(text="Directorio",bg=color,fg=color2)\r
514 l6.place(x=170,y=140)\r
515 l7=Label(text="User",bg=color,fg=color2)\r
516 l7.place(x=170,y=180)\r
517 l8=Label(text="Password",bg=color,fg=color2)\r
518 l8.place(x=170,y=220)\r
519 l9=Label(text="__________________________________________________________________________",justify="left",bg=color,fg=color2)\r
520 l9.place(y=395,x=120)\r
521 #Checkbuttons\r
522 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
523 c1.place(y=370,x=150)\r
524 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
525 c2.place(x=315,y=340)\r
526 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
527 c3.place(y=370,x=315)  \r
528 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
529 c4.place(y=340,x=150)\r
530 #Buttons\r
531 ftp=Button(text="Iniciar Servidor",command=ftpstart,bg=color,fg=color2,overrelief="sunken")\r
532 ftp.place(x=260,y=280)\r
533 b1=Button(text="Seleccionar Directorio",command=lambda:selecdir(),bg=color,fg=color2,width=20,overrelief="sunken")\r
534 b1.place(x=155,y=460)\r
535 b2=Button(text="Guardar cambios",command=lambda:save_all(),bg=color,fg=color2,width=20,overrelief="sunken")\r
536 b2.place(x=155,y=490)\r
537 b3=Button(text="AƱadir usuario",command=lambda:newuser(),bg=color,fg=color2,width=20,overrelief="sunken")\r
538 b3.place(x=320,y=460)\r
539 b4=Button(text="Resetear cambios",command=lambda:reset(),bg=color,fg=color2,width=20,overrelief="sunken")\r
540 b4.place(x=320,y=490)\r
541 b5=Button(text="Actualizar usuario",command=lambda:actualizar(),bg=color,fg=color2,width=20,overrelief="sunken")\r
542 b5.place(x=155,y=520)\r
543 b6=Button(text="Eliminar usuario",command=lambda:remove(),bg=color,fg=color2,width=20,overrelief="sunken")\r
544 b6.place(x=320,y=520)\r
545 b7=Button(text="Usuario de PC",command=user_auth,bg=color,fg=color2,overrelief="sunken",width=20)\r
546 b7.place(y=430,x=155)\r
547 b8=Button(text="Crear ContraseƱa",command=pass_auth_def,bg=color,fg=color2,overrelief="sunken",width=20)\r
548 b8.place(y=430,x=320)\r
549 b9=Button(text="Cargar FCFG",command=analsis,bg=color,fg=color2,overrelief="sunken",width=20)\r
550 b9.place(y=550,x=155)\r
551 b10=Button(text="Exportar FCFG",command=save_an,bg=color,fg=color2,overrelief="sunken",width=20)\r
552 b10.place(y=550,x=320)\r
553 #Menu\r
554 """\r
555 \r
556 abc=Menubutton(fg=color2,bg=color,text="Editar",font=("ARial",10))\r
557 abc.place(x=0,y=5)\r
558 abc1=Menubutton(fg=color2,bg=color,text="Servidor",font=("ARial",10))\r
559 abc1.place(x=50,y=5)\r
560 abc2=Menubutton(fg=color2,bg=color,text="Ayuda",font=("ARial",10))\r
561 abc2.place(x=110,y=5)\r
562 \r
563 menu=Menu(abc,tearoff=0)\r
564 menu1=Menu(abc1,tearoff=0)\r
565 menu2=Menu(abc2,tearoff=0)\r
566 \r
567 \r
568 abc.config(menu=menu)\r
569 abc1.config(menu=menu1)\r
570 abc2.config(menu=menu2)\r
571 \r
572 menu.config(fg=color2,bg=color)\r
573 menu1.config(fg=color2,bg=color)\r
574 menu2.config(fg=color2,bg=color)\r
575 \r
576 configure=Menu(menu,tearoff=0,fg=color2,bg=color)\r
577 \r
578 #menu.add_cascade(label="Editar",menu=menu)\r
579 #ftp1=Menu(menu,tearoff=0,fg=color2,bg=color)\r
580 ftp1=menu1\r
581 ftp1.add_command(label="Iniciar servidor",command=lambda:ftpstart())\r
582 ftp1.add_command(label="Parar servidor",command=lambda:ftpstop())\r
583 ftp1.add_separator()\r
584 ftp1.add_command(label="Cerrar APP",command=lambda:root.destroy())\r
585 #menu.add_cascade(label="Servidor",menu=ftp1)\r
586 \r
587 #ayuda=Menu(menu,tearoff=0,fg=color2,bg=color)\r
588 ayuda=menu2\r
589 ayuda.add_command(label="Puntuar app",command=lambda:subprocess.Popen(["pythonw","ext\\puntua.py"]))\r
590 ayuda.add_command(label="Acerca de...",command=lambda:subprocess.Popen(["pythonw","ext\\acerca_de.py"]))\r
591 ayuda.add_separator()\r
592 ayuda.add_command(label="IP",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help.py"]))\r
593 ayuda.add_command(label="Directorio",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help1.py"]))\r
594 ayuda.add_command(label="Usuario",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help2.py"]))\r
595 ayuda.add_command(label="Permisos",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help3.py"]))\r
596 #menu.add_cascade(label="Ayuda",menu=ayuda)\r
597 menu.add_command(label="ConfiguraciĆ³n",command=tkinter_init)\r
598 """\r
599 menu=Menu(root)\r
600 menu.config(fg=color2,bg=color)\r
601 root.config(menu=menu)\r
602 configure=Menu(menu,tearoff=0,fg=color2,bg=color)\r
603 menu.add_cascade(label="Editar",menu=configure)\r
604 ftp1=Menu(menu,tearoff=0,fg=color2,bg=color)\r
605 ftp1.add_command(label="Iniciar servidor",command=lambda:ftpstart())\r
606 ftp1.add_command(label="Parar servidor",command=lambda:ftpstop())\r
607 ftp1.add_separator()\r
608 ftp1.add_command(label="Cerrar APP",command=lambda:root.destroy())\r
609 menu.add_cascade(label="Servidor",menu=ftp1)\r
610 ayuda=Menu(menu,tearoff=0,fg=color2,bg=color)\r
611 ayuda.add_command(label="Puntuar app",command=lambda:subprocess.Popen(["pythonw","ext\\puntua.pyw"]))\r
612 ayuda.add_command(label="Acerca de...",command=lambda:subprocess.Popen(["pythonw","ext\\acerca_de.pyw"]))\r
613 ayuda.add_separator()\r
614 ayuda.add_command(label="IP",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help.pyw"]))\r
615 ayuda.add_command(label="Directorio",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help1.pyw"]))\r
616 ayuda.add_command(label="Usuario",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help2.pyw"]))\r
617 ayuda.add_command(label="Permisos",command=lambda:subprocess.Popen(["pythonw","ext\\Ftp_help3.pyw"]))\r
618 menu.add_cascade(label="Ayuda",menu=ayuda)\r
619 configure.add_command(label="ConfiguraciĆ³n",command=tkinter_init)\r
620 \r
621 ip_ent=Entry(textvariable=ip_var,bg=color,fg=color2,width=16)\r
622 Port=Spinbox(justify="center",textvariable=port,width=8,bg=color,fg=color2,to=9999,buttonbackground=color)\r
623 Dir=Entry(textvariable=directory,width=29,bg=color,fg=color2)\r
624 Dir.place(x=260,y=140)\r
625 User=Entry(textvariable=user,width=15,bg=color,justify="center",fg=color2)\r
626 Perm=Entry(textvariable=perm,width=10,bg=color,justify="center",fg=color2)\r
627 Pass=Entry(textvariable=pass2,width=29,justify="center",bg=color,fg=color2)\r
628 Port.place(x=375,y=100)\r
629 User.place(x=260,y=180)\r
630 Perm.place(x=375,y=180)\r
631 ip_ent.place(x=260,y=100)\r
632 Pass.place(x=260,y=220)\r
633 \r
634 status1=Label(text="password",fg=color2,bg=color,width=29,justify="center")\r
635 status1.place(x=245,y=240)\r
636 pass2_status=""\r
637 def while_():\r
638         global pass2_status,pass2\r
639         while True:\r
640                 time.sleep(0.5)\r
641                 if pass2_status==pass2.get() and anonim.get()=="0":\r
642                         pass\r
643                 elif anonim.get()=="1":\r
644                         raise(ValueError)\r
645                         #Este error es para matar el hilo no se asusten šŸ¤£\r
646                 else:\r
647                         pass2_status=pass2.get()\r
648                         status1.config(text=crud.check_password_potential(pass2.get()))\r
649 t=threading.Thread(target=while_)\r
650 t.start()\r
651 \r
652 #Llamadas a funciones necesarias\r
653 \r
654 try:\r
655         os.mkdir("configs")\r
656 except:\r
657         pass\r
658 crud.connect("configs\\cfg.db")\r
659 def connect_db():\r
660         try:\r
661                 crud.runcode("""CREATE TABLE configs(\r
662                 id INTEGER PRIMARY KEY AUTOINCREMENT,\r
663                 cfg_aut boolean,\r
664                 cfg_ann boolean,\r
665                 cfg_ip,\r
666                 cfg_port INTEGER,\r
667                 cfg_dir,\r
668                 cfg_usr,\r
669                 cfg_pass,\r
670                 show,\r
671                 cfg_auth INTEGER,\r
672                 perm\r
673                 )""")\r
674                 \r
675                 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
676                 crud.save()\r
677                 read_db=crud.read("configs")\r
678                 print(read_db)\r
679                 b64=read_db[0][6],read_db[0][7]\r
680                 b64=x64.decode_list_x64(b64)\r
681 \r
682                 run_open.set(str(read_db[0][1]))\r
683                 anonim.set(str(read_db[0][2]))\r
684 \r
685                 ip_var.set(read_db[0][3])\r
686 \r
687                 port.set(read_db[0][4])\r
688 \r
689                 directory.set(read_db[0][5])\r
690 \r
691                 user.set(b64[0])\r
692                 pass2.set(b64[1])\r
693 \r
694                 show_.set(read_db[0][8])\r
695 \r
696                 ipauth.set(read_db[0][9])\r
697 \r
698 \r
699                 perm.set(read_db[0][10])\r
700 \r
701                 show()\r
702                 crud.close()\r
703         except:\r
704                 read_db=crud.read("configs")\r
705                 print(read_db)\r
706                 b64=read_db[0][6],read_db[0][7]\r
707                 b64=x64.decode_list_x64(b64)\r
708 \r
709                 run_open.set(str(read_db[0][1]))\r
710                 anonim.set(str(read_db[0][2]))\r
711 \r
712                 ip_var.set(read_db[0][3])\r
713 \r
714                 port.set(read_db[0][4])\r
715 \r
716                 directory.set(read_db[0][5])\r
717 \r
718                 user.set(b64[0])\r
719                 pass2.set(b64[1])\r
720 \r
721                 show_.set(read_db[0][8])\r
722 \r
723                 ipauth.set(read_db[0][9])\r
724 \r
725 \r
726                 perm.set(read_db[0][10])\r
727 \r
728                 show()\r
729                 crud.close()\r
730 \r
731 \r
732 \r
733 connect_db()\r
734 anonimo()\r
735 show()\r
736 if run_open.get()=="1":\r
737         ftpstart()\r
738 else:\r
739         print(run_open.get())\r
740 def close_app():\r
741         try:\r
742                 ftpstop()\r
743         except:\r
744                 pass\r
745         root.destroy()\r
746         anonim.set(1)\r
747         anonimo()\r
748         raise(ValueError)\r
749 \r
750 class HoverButton(Button):\r
751         def __init__(self, master, **kw):\r
752                 Button.__init__(self,master=master,**kw)\r
753                 self.defaultBackground = self["background"]\r
754                 self.bind("<Enter>", self.on_enter)\r
755                 self.bind("<Leave>", self.on_leave)\r
756 \r
757         def on_enter(self, e):\r
758                 self["background"] = self["activebackground"]\r
759 \r
760         def on_leave(self, e):\r
761                 self["background"] = self.defaultBackground\r
762 \r
763 #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
764 #print(b9.config())\r
765 #b9.place(y=0,x=566)\r
766 #root.overrideredirect(1)\r
767 root.protocol('WM_DELETE_WINDOW',close_app)\r
768 root.mainloop()\r