Add files via upload
This commit is contained in:
parent
e12b99ffed
commit
dcd6175041
78
PassmanCLI.py
Normal file
78
PassmanCLI.py
Normal file
@ -0,0 +1,78 @@
|
||||
from logics import *
|
||||
|
||||
def rewrite_to_file(lst):
|
||||
try:
|
||||
decrypt(fpassword)
|
||||
with open('credentials', 'w') as f:
|
||||
for i in lst:
|
||||
f.write('site: '+i[0]+' login: '+i[1]+' password: '+i[2]+' date: '+i[3] + "\n")
|
||||
encrypt(fpassword)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def edit_info_file(index1):
|
||||
lst=read_info_file(fpassword)
|
||||
lst=list(map(list, lst))
|
||||
for i in range(len(lst)):
|
||||
for j in range(len(lst[i])):
|
||||
if lst[i][j]==index1:
|
||||
index1=i
|
||||
|
||||
if type(index1) is str:
|
||||
print("Incorrect site name")
|
||||
else:
|
||||
log=input("New login:")
|
||||
pas=input("New password:")
|
||||
lst[index1][1]=log
|
||||
lst[index1][2]=pas
|
||||
rewrite_to_file(lst)
|
||||
|
||||
def share_passw(index1):
|
||||
lst=read_info_file(fpassword)
|
||||
lst=list(map(list, lst))
|
||||
for i in range(len(lst)):
|
||||
for j in range(len(lst[i])):
|
||||
if lst[i][j]==index1:
|
||||
index1=i
|
||||
if type(index1) is str:
|
||||
print("Incorrect site name")
|
||||
else:
|
||||
qr_share(lst[index1][0],lst[index1][1],lst[index1][2])
|
||||
|
||||
if __name__ == "__main__":
|
||||
from stdiomask import getpass
|
||||
fpassword = getpass('Введите пароль: ')
|
||||
while True:
|
||||
mode=int(input("select mode: 1-write, 2-read, 3-edit, 4-share \n"))
|
||||
if mode==1:
|
||||
website=input("Website: ")
|
||||
login=input("Login: ")
|
||||
password=input("Password: ")
|
||||
write_to_file(website,login,password,fpassword)
|
||||
if mode==2:
|
||||
lst=read_info_file(fpassword)
|
||||
print("==================================")
|
||||
for i in lst:
|
||||
for j in i:
|
||||
print(j)
|
||||
print("==================================")
|
||||
if mode==3:
|
||||
lst=read_info_file(fpassword)
|
||||
print("==================================")
|
||||
for i in lst:
|
||||
for j in i:
|
||||
print(j)
|
||||
print("==================================")
|
||||
index1=(input("Enter site name:"))
|
||||
edit_info_file(index1)
|
||||
if mode==4:
|
||||
lst=read_info_file(fpassword)
|
||||
print("==================================")
|
||||
for i in lst:
|
||||
for j in i:
|
||||
print(j)
|
||||
print("==================================")
|
||||
index1=(input("Enter site name:"))
|
||||
share_passw(index1)
|
||||
213
PassmanGUI.py
Normal file
213
PassmanGUI.py
Normal file
@ -0,0 +1,213 @@
|
||||
from customtkinter import CTkLabel,CTkButton,CTkEntry,CTkScrollableFrame,CTkTabview,CTk,get_appearance_mode
|
||||
from logics import *
|
||||
from tkinter import PhotoImage
|
||||
import os
|
||||
window = CTk()
|
||||
window.title("PassMan by Anqude")
|
||||
scriptdir=os.path.abspath(__file__)
|
||||
os.chdir(scriptdir.removesuffix('/PassmanGUI.py'))
|
||||
window.tk.call('wm', 'iconphoto', window._w, PhotoImage(file='./ui/icon.png'))
|
||||
theme=get_appearance_mode()
|
||||
if theme=="Dark":
|
||||
bg_color="#242424"
|
||||
fg_color="#dbdbdb"
|
||||
else:
|
||||
fg_color="#242424"
|
||||
bg_color="#dbdbdb"
|
||||
tabview = CTkTabview(window)
|
||||
tab_write=tabview.add("Write") # add tab at the end
|
||||
tab_read=tabview.add("Read") # add tab at the end
|
||||
tabview.set("Write") # set currently visible tab
|
||||
|
||||
def get_password():
|
||||
fpassword=Password_entry.get()
|
||||
return fpassword
|
||||
def enter():
|
||||
Pass_text.pack_forget()
|
||||
Password_entry.pack_forget()
|
||||
button.pack_forget()
|
||||
get_password()
|
||||
banan()
|
||||
|
||||
Password_entry=CTkEntry(window)
|
||||
Pass_text=CTkLabel(window,text="Password: ")
|
||||
button=CTkButton(window,text="Log in!", command=enter)
|
||||
|
||||
Pass_text.pack(fill="x", expand=True,padx=5,pady=5, side="top",anchor="n")
|
||||
Password_entry.pack(fill="x", expand=True,padx=5,pady=5, side="top",anchor="n")
|
||||
button.pack(fill="x", expand=True,padx=5,pady=5, side="top",anchor="n")
|
||||
|
||||
Names=["Website:","Login:","Password:","Create time:"]
|
||||
|
||||
def func(index):
|
||||
inform=read_info_file(get_password())
|
||||
tabview.pack_forget()
|
||||
Site_label=CTkLabel(window,text=Names[0])
|
||||
Site_val=CTkLabel(window)
|
||||
Login_label=CTkLabel(window,text=Names[1])
|
||||
Login_val=CTkLabel(window)
|
||||
Password_label=CTkLabel(window,text=Names[2])
|
||||
Password_val=CTkLabel(window)
|
||||
def rewrite():
|
||||
Site_val.grid_forget()
|
||||
Login_val.grid_forget()
|
||||
Password_val.grid_forget()
|
||||
CopyLoginB.grid_forget()
|
||||
CopyPassB.grid_forget()
|
||||
QRShare.grid_forget()
|
||||
Site_entry=CTkEntry(window)
|
||||
Site_entry.insert(0, inform[index][0])
|
||||
Login_entry=CTkEntry(window)
|
||||
Login_entry.insert(0, inform[index][1])
|
||||
Password_entry=CTkEntry(window)
|
||||
Password_entry.insert(0, inform[index][2])
|
||||
Site_entry.grid(row=0, column=1,padx=12,pady=10)
|
||||
Login_entry.grid(row=1, column=1,padx=12,pady=10)
|
||||
Password_entry.grid(row=2, column=1,padx=12,pady=10)
|
||||
def save():
|
||||
edit_info_file(index,Site_entry.get(),Login_entry.get(),Password_entry.get(),get_password())
|
||||
readl()
|
||||
DontEdit()
|
||||
RewrireButton.configure(command=save,text="Save!")
|
||||
ExitButton.grid_forget()
|
||||
RewrireButton.grid_forget()
|
||||
RewrireButton.grid(row=3, column=0,padx=12,pady=10)
|
||||
|
||||
def DontEdit():
|
||||
Site_entry.grid_forget()
|
||||
Login_entry.grid_forget()
|
||||
Password_entry.grid_forget()
|
||||
Site_label.grid_forget()
|
||||
Login_label.grid_forget()
|
||||
Password_label.grid_forget()
|
||||
RewrireButton.grid_forget()
|
||||
ExitButton.grid_forget()
|
||||
func(index)
|
||||
ExitButton.configure(command=DontEdit,text="Don`t save!")
|
||||
ExitButton.grid_forget()
|
||||
ExitButton.grid(row=3, column=1,padx=12,pady=10)
|
||||
|
||||
|
||||
|
||||
def Exit():
|
||||
Site_label.grid_forget()
|
||||
Site_val.grid_forget()
|
||||
Login_label.grid_forget()
|
||||
Login_val.grid_forget()
|
||||
Password_label.grid_forget()
|
||||
Password_val.grid_forget()
|
||||
RewrireButton.grid_forget()
|
||||
ExitButton.grid_forget()
|
||||
ExitButton.grid_forget()
|
||||
CopyLoginB.grid_forget()
|
||||
CopyPassB.grid_forget()
|
||||
QRShare.grid_forget()
|
||||
tabview.pack(fill="both", expand=True,anchor='center')
|
||||
|
||||
ExitButton=CTkButton(window,command=Exit,text="Exit!")
|
||||
Site_val.configure(text=inform[index][0])
|
||||
Login_val.configure(text=inform[index][1])
|
||||
Password_val.configure(text=inform[index][2])
|
||||
Site_label.grid(row=0, column=0,padx=12,pady=10)
|
||||
Site_val.grid(row=0, column=1,padx=12,pady=10)
|
||||
Login_label.grid(row=1, column=0,padx=12,pady=10)
|
||||
Login_val.grid(row=1, column=1,padx=12,pady=10)
|
||||
Password_label.grid(row=2, column=0,padx=12,pady=10)
|
||||
Password_val.grid(row=2, column=1,padx=12,pady=10)
|
||||
RewrireButton=CTkButton(window,command=rewrite,text="🖊",width=10)
|
||||
RewrireButton.grid(row=3, column=2,padx=12,pady=10)
|
||||
ExitButton.grid(row=3, column=1,padx=12,pady=10)
|
||||
def CopyLogin():
|
||||
from pyperclip import copy
|
||||
copy(inform[index][1])
|
||||
CopyLoginB=CTkButton(window,command=CopyLogin,text="📋",width=10)
|
||||
def CopyPass():
|
||||
from pyperclip import copy
|
||||
copy(inform[index][2])
|
||||
|
||||
def genadiy():
|
||||
state=qr_image(inform[index][0],inform[index][1],inform[index][2],fg_color,bg_color)
|
||||
from tkinter import Toplevel,Label
|
||||
from PIL import ImageTk, Image
|
||||
if state==True:
|
||||
window = Toplevel()
|
||||
window.geometry("200x200")
|
||||
window.configure(bg=bg_color)
|
||||
window.title("QR")
|
||||
window.tk.call('wm', 'iconphoto', window._w, PhotoImage(file='qr.png'))
|
||||
bg = ImageTk.PhotoImage(file="qr.png")
|
||||
label = Label(window,background=bg_color,highlightbackground=bg_color)
|
||||
label.pack(fill="both", expand=True,anchor='center')
|
||||
counter_loop=[0]
|
||||
def resize_image(win):
|
||||
if counter_loop[0]%3==0:
|
||||
image = Image.open("qr.png")
|
||||
size=min(win.width,win.height)
|
||||
resized = image.resize((size, size))
|
||||
image2 = ImageTk.PhotoImage(resized)
|
||||
window.image2=image2
|
||||
label.configure(image=image2)
|
||||
counter_loop.insert(0,counter_loop[0]+1)
|
||||
window.bind("<Configure>", resize_image)
|
||||
window.mainloop()
|
||||
else:
|
||||
window = Toplevel()
|
||||
window.configure(bg=bg_color)
|
||||
window.title("Warning!")
|
||||
window.tk.call('wm', 'iconphoto', window._w, PhotoImage(file='./ui/warn.png'))
|
||||
label = Label(window,background=bg_color,highlightbackground=bg_color,text="Too much data to make QR!",foreground=fg_color,font=("Monospace",16))
|
||||
label.pack(fill="both", expand=True,anchor='center')
|
||||
window.attributes('-topmost', True)
|
||||
window.update()
|
||||
window.mainloop()
|
||||
CopyPassB=CTkButton(window,command=CopyPass,text="📋",width=10)
|
||||
QRShare=CTkButton(window,command=genadiy,text="QR!")
|
||||
CopyLoginB.grid(row=1, column=2,padx=12,pady=10)
|
||||
CopyPassB.grid(row=2, column=2,padx=12,pady=10)
|
||||
QRShare.grid(row=3, column=0,padx=12,pady=10)
|
||||
scrollFrame = CTkScrollableFrame(master=tab_read)
|
||||
scrollFrame.pack(fill="both",expand=True,padx=20, pady=20)
|
||||
def readl():
|
||||
try:
|
||||
buttonEdit.grid_forget()
|
||||
Infos_label.grid_forget()
|
||||
title.grid_forget()
|
||||
except:
|
||||
for i in range(2):
|
||||
Title=CTkLabel(scrollFrame,text=Names[i])
|
||||
Title.grid(row=0, column=i,padx=12,pady=10)
|
||||
inform=read_info_file(get_password())
|
||||
for i in range(len(inform)):
|
||||
buttonEdit=CTkButton(scrollFrame,text="≡",command=lambda x=i: func(x),width=12)
|
||||
buttonEdit.grid(row=i+1, column=2,padx=12,pady=10)
|
||||
|
||||
for j in range(2):
|
||||
Infos_label= CTkLabel(scrollFrame,text=inform[i][j])
|
||||
Infos_label.grid(row=i+1, column=j,padx=12,pady=10)
|
||||
|
||||
|
||||
def banan():
|
||||
tabview.pack(fill="both", expand=True,anchor='center')
|
||||
readl()
|
||||
|
||||
|
||||
def write ():
|
||||
write_to_file(Web_entry.get(),log_entry.get(),pas_entry.get(),get_password())
|
||||
readl()
|
||||
|
||||
|
||||
Site_label=CTkLabel(tab_write,text=Names[0])
|
||||
Login_label=CTkLabel(tab_write,text=Names[1])
|
||||
Password_label=CTkLabel(tab_write,text=Names[2])
|
||||
Web_entry=CTkEntry(tab_write)
|
||||
log_entry=CTkEntry(tab_write)
|
||||
pas_entry=CTkEntry(tab_write)
|
||||
SaveBut=CTkButton(tab_write,text="Save!", command=write)
|
||||
Web_entry.grid(row=0, column=1,padx=12,pady=10)
|
||||
log_entry.grid(row=1, column=1,padx=12,pady=10)
|
||||
pas_entry.grid(row=2, column=1,padx=12,pady=10)
|
||||
Site_label.grid(row=0, column=0,padx=12,pady=10)
|
||||
Login_label.grid(row=1, column=0,padx=12,pady=10)
|
||||
Password_label.grid(row=2, column=0,padx=12,pady=10)
|
||||
SaveBut.grid(row=3, column=1,padx=12,pady=10)
|
||||
window.mainloop()
|
||||
18
README.md
Normal file
18
README.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Passman
|
||||
## Yet simple password manager
|
||||
|
||||
### Dependencies
|
||||
**Python**
|
||||
```sh
|
||||
pip install tk pyperclip qrcode customtkinter pyAesCrypt
|
||||
```
|
||||
|
||||
**On debian**
|
||||
```sh
|
||||
sudo apt install python3-tk python3-pil.imagetk xclip
|
||||
```
|
||||
|
||||
**On fedora**
|
||||
```sh
|
||||
sudo dnf install python3-tkinter python3-pillow-tk xclip
|
||||
```
|
||||
77
logics.py
Normal file
77
logics.py
Normal file
@ -0,0 +1,77 @@
|
||||
def qr_share(site,login, password):
|
||||
import qrcode
|
||||
qr = qrcode.QRCode()
|
||||
qr.add_data('site = '+site+' login = '+login+' password = '+password)
|
||||
return(qr.print_ascii())
|
||||
|
||||
def qr_image(site,login, password,fg_color,bg_color):
|
||||
import qrcode
|
||||
qr = qrcode.QRCode()
|
||||
qr.add_data('site = '+site+' login = '+login+' password = '+password)
|
||||
try:
|
||||
qr.make(fit=True)
|
||||
except:
|
||||
return False
|
||||
img = qr.make_image(fill_color=fg_color, back_color=bg_color)
|
||||
img.save("qr.png")
|
||||
return True
|
||||
def encrypt(fpassword):
|
||||
import pyAesCrypt
|
||||
pyAesCrypt.encryptFile('credentials', 'credentials.aes', fpassword)
|
||||
import os
|
||||
os.remove("./credentials")
|
||||
def decrypt(fpassword):
|
||||
import pyAesCrypt
|
||||
pyAesCrypt.decryptFile('credentials.aes', 'credentials', fpassword)
|
||||
import os
|
||||
os.remove("./credentials.aes")
|
||||
|
||||
|
||||
def read_info_file(fpassword):
|
||||
info_list = []
|
||||
try:
|
||||
decrypt(fpassword)
|
||||
with open('credentials', 'r') as f:
|
||||
for string in f.readlines():
|
||||
site = string.split('site: ')[1].split(' ')[0]
|
||||
login = string.split('login: ')[1].split(' ')[0]
|
||||
password = string.split('password: ')[1].split(' ')[0]
|
||||
cur_time = string.split('date: ')[1].strip()
|
||||
info_list.append((site, login, password, cur_time))
|
||||
encrypt(fpassword)
|
||||
except:
|
||||
pass
|
||||
return info_list
|
||||
|
||||
|
||||
def write_to_file(site,login, password,fpassword):
|
||||
try:
|
||||
decrypt(fpassword)
|
||||
except:
|
||||
pass
|
||||
from time import gmtime, strftime
|
||||
cur_time=strftime("%Y-%m-%d %H:%M:%S", gmtime()).replace(" ","_")
|
||||
with open('credentials', 'a') as f:
|
||||
f.write('site: '+site+' login: '+login +' password: '+ password +' date: '+(cur_time) + "\n")
|
||||
try:
|
||||
encrypt(fpassword)
|
||||
except:
|
||||
pass
|
||||
|
||||
def rewrite_to_file(lst,fpassword):
|
||||
try:
|
||||
decrypt(fpassword)
|
||||
with open('credentials', 'w') as f:
|
||||
for i in lst:
|
||||
f.write('site: '+i[0]+' login: '+i[1]+' password: '+i[2]+' date: '+i[3] + "\n")
|
||||
encrypt(fpassword)
|
||||
except:
|
||||
pass
|
||||
|
||||
def edit_info_file(index,new_site,new_login,new_pas,fpassword):
|
||||
lst=read_info_file(fpassword)
|
||||
lst=list(map(list, lst))
|
||||
lst[index][0]=new_site
|
||||
lst[index][1]=new_login
|
||||
lst[index][2]=new_pas
|
||||
rewrite_to_file(lst,fpassword)
|
||||
BIN
ui/icon.png
Normal file
BIN
ui/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Loading…
x
Reference in New Issue
Block a user