diff --git a/Folder Locker & Hider/app.png b/Folder Locker & Hider/app.png new file mode 100644 index 0000000..9ac0d56 Binary files /dev/null and b/Folder Locker & Hider/app.png differ diff --git a/Folder Locker & Hider/application.pyw b/Folder Locker & Hider/application.pyw new file mode 100644 index 0000000..e5bcbbc --- /dev/null +++ b/Folder Locker & Hider/application.pyw @@ -0,0 +1,223 @@ +import locker + +import os +import tkinter as tk +from tkinter import PhotoImage +from tkinter import messagebox +from tkinter import filedialog + +cwd = os.getcwd() +if not os.path.exists('files/'): + os.mkdir('files') + +class Application(tk.Frame): + def __init__(self, master): + super().__init__(master=master) + self.master = master + self.pack() + + self.title_frame() + self.main_frame() + self.status_frame() + + self.folder_path = '' + self.fname = '' + + def title_frame(self): + self.title = tk.Label(self, bg='gray',font=("Helvetica", 14), anchor='w') + self.title.configure(width=35, height=3) + self.title['text'] = '\t Folder Locker / Unlocker' + self.title.grid(row=0, column=0, columnspan=2) + + def body_frame(self): + self.body = tk.Frame(self, width=390, height=230) + self.body.grid(row=1, column=0, columnspan=2, pady=10) + + def status_frame(self): + self.status = tk.Text(self, width=50, height=3, fg='dodger blue') + self.status.insert(tk.END, 'The folder you lock will be hidden automatically\n') + self.status.insert(tk.END, 'Use the app to unlock it back') + self.status.configure(state='disabled') + self.status.grid(row=2, column=0, columnspan=2) + + def main_frame(self): + self.body_frame() + + self.lock_button = tk.Button(self.body, font =('Verdana', 15), command=self.lock_frame) + self.lock_button['image'] = lock_icon + self.lock_button['compound'] = tk.TOP + self.lock_button['text'] = 'Lock \nFolder' + self.lock_button.configure(width=120, height=120) + self.lock_button.grid(row=0, column=0, padx=(0,30), pady=(20,7)) + + self.unlock_button = tk.Button(self.body, font =('Verdana', 15), command=self.unlock_frame) + self.unlock_button['image'] = unlock_icon + self.unlock_button['compound'] = tk.TOP + self.unlock_button['text'] = ' Unlock \nFolder' + self.unlock_button.configure(width=120, height=120) + self.unlock_button.grid(row=0, column=1, padx=(30,0), pady=(20,7)) + + def lock_frame(self): + self.body.destroy() + self.body_frame() + + self.status.configure(state='normal') + self.status.delete(1.0, tk.END) + self.status.insert(tk.END, 'Choose a folder, enter password and click lock\n') + self.status.insert(tk.END, 'folder to lock and hide the folder') + self.status.configure(state='disabled') + + self.password = tk.StringVar() + + self.pathlabel = tk.Label(self.body, bg='white', fg='black', + borderwidth=1, relief='groove', wraplength=150) + self.pathlabel['text'] = 'Select Folder' + self.pathlabel.configure(width=22, height=3) + self.pathlabel.grid(row=0, column=0, pady=10, padx=15) + + self.choose_folder = tk.Button(self.body, image=choose_folder_icon) + self.choose_folder['command'] = self.select_folder + self.choose_folder.grid(row=0, column=1, padx=(20,5), pady=10) + + self.back = tk.Button(self.body, image=back_icon) + self.back['command'] = self.go_back + self.back.grid(row=0, column=2, padx=(20,5), pady=10) + + self.elabel = tk.Label(self.body, anchor='e') + self.elabel['text'] = 'Enter Password' + self.elabel.grid(row=1, column=0, pady=20) + + self.entry = tk.Entry(self.body) + self.entry['textvariable'] = self.password + self.entry.grid(row=1, column=1, columnspan=2, pady=20) + + self.lock =tk.Button(self.body, bg='green', width=20) + self.lock['text'] = f'Lock Folder' + self.lock['command'] = lambda : self.lock_folder(self.folder_path) + self.lock.grid(row=2, column=0, columnspan=3) + + def unlock_frame(self): + self.body.destroy() + self.body_frame() + + self.password = tk.StringVar() + + self.pathlabel = tk.Label(self.body, bg='white', fg='black', + borderwidth=1, relief='groove', wraplength=150) + self.pathlabel['text'] = 'Select Folder' + self.pathlabel.configure(width=22, height=3) + self.pathlabel.grid(row=0, column=0, pady=2, padx=15) + + self.back = tk.Button(self.body, image=back_icon) + self.back['command'] = self.go_back + self.back.grid(row=0, column=1, padx=(20,5), pady=2) + + self.scrollbar = tk.Scrollbar(self.body, orient=tk.VERTICAL) + self.scrollbar.grid(row=0,column=3, rowspan=4, sticky='ns') + + self.list = tk.Listbox(self.body, selectmode=tk.SINGLE, + yscrollcommand=self.scrollbar.set, selectbackground='sky blue') + self.list.config(height=10) + self.enumerate_folders() + self.list.bind('', self.get_folder) + + self.scrollbar.config(command=self.list.yview) + self.list.grid(row=0, column=2, rowspan=4) + + self.elabel = tk.Label(self.body, anchor='e') + self.elabel['text'] = 'Enter Password' + self.elabel.grid(row=1, column=0, columnspan=2, pady=(1,1)) + + self.entry = tk.Entry(self.body) + self.entry['textvariable'] = self.password + self.entry.grid(row=2, column=0, columnspan=2) + + self.unlock =tk.Button(self.body, bg='green', width=20) + self.unlock['text'] = f'Unlock Folder' + self.unlock['command'] = lambda : self.unlock_folder(self.fname) + self.unlock.grid(row=3, column=0, columnspan=2, pady=(10,0)) + + def go_back(self): + self.body.destroy() + self.main_frame() + + self.status.configure(state='normal') + self.status.delete(1.0, tk.END) + self.status.insert(tk.END, 'The folder you lock will be hidden automatically\n') + self.status.insert(tk.END, 'Use the app to unlock it back') + self.status.configure(state='disabled') + + def select_folder(self): + self.folder_path = filedialog.askdirectory(initialdir=cwd) + self.pathlabel['anchor'] = 'w' + self.pathlabel['text'] = self.folder_path + + def enumerate_folders(self): + self.dct = locker.read_json() + self.folders_list = list(self.dct.keys()) + + self.status.configure(state='normal') + self.status.delete(1.0, tk.END) + + if len(self.folders_list) > 0: + for index, fname in enumerate(self.folders_list): + self.list.insert(index, fname) + self.status.insert(tk.END, 'Choose a folder, enter password and click unlock\n') + self.status.insert(tk.END, 'folder to unlock the folder') + else: + self.status.insert(tk.END, '0 folders locked yet\n') + + self.status.configure(state='disabled') + + def get_folder(self, event): + if event is not None: + self.current = self.list.curselection()[0] + self.folder_path = self.dct[self.folders_list[self.current]][0] + self.key = self.dct[self.folders_list[self.current]][1] + self.pathlabel['text'] = self.folder_path + + def lock_folder(self, path): + password = self.entry.get() + if not self.folder_path == '': + if len(password) <= 4: + messagebox.showerror('Failed to lock', 'password is too short') + else: + status = locker.lock(self.folder_path, password) + if status == 'failed': + messagebox.showerror('Failed to lock', 'A folder with this name already locked') + else: + messagebox.showinfo('Folder status', 'Locked successfully') + self.password.set('') + self.pathlabel['anchor'] = 'c' + self.pathlabel['text'] = 'Select Folder' + + def unlock_folder(self, fname): + password = self.entry.get() + if not self.folder_path == '': + if len(password) <= 4: + messagebox.showerror('Failed to unlock', 'password is too short') + else: + status = locker.unlock(self.folder_path, password, self.key) + if status == 'failed': + messagebox.showerror('Failed to unlock', 'Incorrect Password') + else: + messagebox.showinfo('Folder status', 'Folder unlocked successfully') + self.password.set('') + self.pathlabel['anchor'] = 'c' + self.pathlabel['text'] = 'Select Folder' + self.list.delete(0, tk.END) + self.enumerate_folders() + +if __name__ == '__main__': + root = tk.Tk() + root.geometry('400x305') + root.title('Folder Locker/Unlocker') + root.resizable(0,0) + + lock_icon = PhotoImage(file='icons/lock.png').subsample(2,2) + unlock_icon = PhotoImage(file='icons/unlock.png').subsample(2,2) + back_icon = PhotoImage(file='icons/back.png') + choose_folder_icon = PhotoImage(file='icons/choose_folder.png') + + app = Application(master=root) + app.mainloop() \ No newline at end of file diff --git a/Folder Locker & Hider/icons/back.png b/Folder Locker & Hider/icons/back.png new file mode 100644 index 0000000..e1de773 Binary files /dev/null and b/Folder Locker & Hider/icons/back.png differ diff --git a/Folder Locker & Hider/icons/choose_folder.png b/Folder Locker & Hider/icons/choose_folder.png new file mode 100644 index 0000000..a5b9198 Binary files /dev/null and b/Folder Locker & Hider/icons/choose_folder.png differ diff --git a/Folder Locker & Hider/icons/lock.png b/Folder Locker & Hider/icons/lock.png new file mode 100644 index 0000000..76fb331 Binary files /dev/null and b/Folder Locker & Hider/icons/lock.png differ diff --git a/Folder Locker & Hider/icons/unlock.png b/Folder Locker & Hider/icons/unlock.png new file mode 100644 index 0000000..d0cfa05 Binary files /dev/null and b/Folder Locker & Hider/icons/unlock.png differ diff --git a/Folder Locker & Hider/locker.py b/Folder Locker & Hider/locker.py new file mode 100644 index 0000000..7d19a35 --- /dev/null +++ b/Folder Locker & Hider/locker.py @@ -0,0 +1,84 @@ +import os +import json +import shelve +import random +import subprocess + +def read_json(): + json_file = 'files/locked_folders.json' + if os.path.exists(json_file): + with open(json_file, 'r') as file: + dct = json.load(file) + else: + dct = {} + + return dct + +def write_to_json(data): + json_file = 'files/locked_folders.json' + with open(json_file, 'w') as file: + json.dump(data, file) + +def get_from_json(fname): + dct = read_json() + return dct.get(fname, None) + +# Locker/Unlocker ---------------------------------------------------------------- + +def generate_key(): + string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' + keygen = random.sample(string, 12) + return ''.join(keygen) + +def lock(fpath, password): + key = generate_key() + + fname = os.path.basename(fpath) + cwd = '/'.join(fpath.split('/')[:-1]) + '/' + command1 = 'ren ' + fname + ' "Control Panel.{21EC2020-3AEA-1069-A2DD-' + key + '}"' + command2 = 'attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-' + key + '}"' + + dct = read_json() + + if not fname in dct.keys(): + dct[fname] = [fpath, key] + write_to_json(dct) + + with shelve.open('files/pwd') as pwd_manager: + pwd_manager[fname] = password + + subprocess.call(command1, shell=True, cwd=cwd) + subprocess.call(command2, shell=True, cwd=cwd) + + status = 'locked' + else: + status = 'failed' + + return status + + +def unlock(fpath, password, key): + fname = os.path.basename(fpath) + cwd = '/'.join(fpath.split('/')[:-1]) + '/' + command1 = 'attrib -h -s "Control Panel.{21EC2020-3AEA-1069-A2DD-' + key + '}"' + command2 = 'ren "Control Panel.{21EC2020-3AEA-1069-A2DD-' + key + '}" ' + fname + + with shelve.open('files/pwd') as pwd_manager: + pass_ = pwd_manager[fname] + + if pass_ == password: + dct = read_json() + del dct[fname] + write_to_json(dct) + + subprocess.call(command1, shell=True, cwd=cwd) + subprocess.call(command2, shell=True, cwd=cwd) + + with shelve.open('files/pwd') as pwd_manager: + del pwd_manager[fname] + + status = 'unlocked' + else: + status = 'failed' + + return status \ No newline at end of file diff --git a/Folder Locker & Hider/readme.md b/Folder Locker & Hider/readme.md new file mode 100644 index 0000000..c21ceda --- /dev/null +++ b/Folder Locker & Hider/readme.md @@ -0,0 +1,39 @@ +# Folder Locker & Hider + +[![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://forthebadge.com) +[![forthebadge](https://forthebadge.com/images/badges/built-with-swag.svg)](https://forthebadge.com) +[![forthebadge](https://forthebadge.com/images/badges/made-with-python.svg)](https://forthebadge.com) + +Folder Locker & Hider is a simple python tkinter based application to lock / unlock and hide folders +using simple windows property + +![Alt text](app.png?raw=true "Folder Locker & Hider") + +This app is only for windows platform + +## How to Download + +Download this project from here [Download Folder Locker & Hider](https://downgit.github.io/#/home?url=https://github.com/pyGuru123/Tkinter-Applications/tree/master/Folder%20Locker%20%26%20Hider) + +## Requirements + + No external package is required + +## Usage + +Double click the application.pyw script to open the GUI application, then + +to lock folder: + click the lock folder button, select the folder that you want to lock, enter a password and then click lock folder button to lock the folder, the folder will now be hidden automatically. + + password should be greater than 4 digits in length, the locked folder can only be unlocked by using this app, also the folder will not show wven when show hidden items is checked + +to unlock folder: + click the unlock folder button, select the locked folder name from the listbox on the right [double click it], then enter the correct password and unlock it by click the unlock folder button. + The folder will now be unhidden automatically + + +## Contributing +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. + +Please make sure to update tests as appropriate. \ No newline at end of file diff --git a/README.md b/README.md index 38600e0..d30befb 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,7 @@ So far, the following projects have been integrated to this repo: |[GithubBot](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/GithubBot)|[Abhilasha](https://github.com/Abhilasha06)| |[Translate CLI](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/TranslateCLI)|[Rodrigo Oliveira](https://github.com/rodrigocam)| |[Rock-Paper-Scissor Game](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/Rock-Paper-Scissor)|[Punit Sakre](https://github.com/punitsakre23)| +|[Folder Locker and hider](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/Folder%20Locker%20%26%20Hider)|[Prajjwal Pathak](https://github.com/pyguru123)| ## How to use :