def unlock(): encRequest = request.json ticket = encRequest['ticket'] sessKey = ss.decrypt(base64.urlsafe_b64decode(ticket).decode(), server_key) new_file = json.loads(ss.decrypt(encRequest['file'], sessKey)) for file in locked_files: if file['filename'] == new_file['filename']: locked_files.remove(file) return 'File unlocked.'
def add(filename, filepath, token): sessKey = token['session_key'] file = {'filename': filename, 'filepath': filepath} add_json = { 'file': ss.encrypt(json.dumps(file), sessKey), 'ticket': token['ticket'] } post = requests.post(ds_url + "add", json=add_json) return post.text
def quit(opened_files, token): for file in opened_files: sessKey = token['session_key'] close_json = { 'file': ss.encrypt(json.dumps(file), sessKey), 'ticket': token['ticket'] } close = requests.post(ls_url + "unlock", json=close_json) opened_files.remove(file) sys.exit()
def open_file(): encRequest = request.json ticket = encRequest['ticket'] sessKey = ss.decrypt(base64.urlsafe_b64decode(ticket).decode(), server_key) file = json.loads(ss.decrypt(encRequest['file'], sessKey)) for n in [8007, 8008]: server_url = file_server_url + str(n) + "/open?" + 'filename=' + file[ 'filename'] + '&userId=' + file['userId'] in_directory = requests.get(server_url) status_code = in_directory.status_code if status_code == 200: return in_directory.json() elif status_code == 409: return { 'Error:': 'File is already locked.' }, status.HTTP_404_NOT_FOUND return { 'Error:': 'File does not exist amongst servers.' }, status.HTTP_404_NOT_FOUND
def write(opened_files, filename, content, token): for file in opened_files: if file['filename'] == filename: sessKey = token['session_key'] file['file_content'] = content open_json = { 'file': ss.encrypt(json.dumps(file), sessKey), 'ticket': token['ticket'] } updated_file = requests.post(ds_url + "write", json=open_json) return updated_file.text return "Error: No file of such name is opened."
def close(opened_files, filename, token): for file in opened_files: if file['filename'] == filename: sessKey = token['session_key'] close_json = { 'file': ss.encrypt(json.dumps(file), sessKey), 'ticket': token['ticket'] } close = requests.post(ls_url + "unlock", json=close_json) opened_files.remove(file) return opened_files, "File successfully closed." return opened_files, "Error: No file of such name is opened."
def add_file(): encRequest = request.json ticket = encRequest['ticket'] sessKey = ss.decrypt(base64.urlsafe_b64decode(ticket).decode(), server_key) file = json.loads(ss.decrypt(encRequest['file'], sessKey)) status_code = 0 for n in [8007, 8008]: server_name = requests.get(file_server_url + str(n) + "/name") if server_name.text == file['filepath']: add_file = requests.post(file_server_url + str(n) + "/add", json=file) status_code = add_file.status_code else: backup = copy.copy(file) backup['filename'] = str( file['filename']).split('.')[0] + "_backup.txt" backup['server_port'] = str(n) add_file = requests.post(file_server_url + str(n) + "/add", json=backup) if status_code == 200: return add_file.text return 'Error: No such server exists.'
def write_file(): encRequest = request.json ticket = encRequest['ticket'] sessKey = ss.decrypt(base64.urlsafe_b64decode(ticket).decode(), server_key) file = json.loads(ss.decrypt(encRequest['file'], sessKey)) status_code = 0 for n in [8007, 8008]: if str(n) == file['server_port']: print(file) server_url = file_server_url + str(n) + "/write" write = requests.post(server_url, json=file) status_code = write.status_code else: server_url = file_server_url + str(n) + "/write" backup = copy.copy(file) backup['filename'] = str( file['filename']).split('.')[0] + "_backup.txt" backup['server_port'] = str(n) print(backup) write_backup = requests.post(server_url, json=backup) if status_code == 200: return "File successfully upated." return 'Error: Unknown Error.'
def open(opened_files, filename, userId, token): for file in opened_files: if file['filename'] == filename: return opened_files, 'File already opened.' sessKey = token['session_key'] file = {'filename': filename, 'userId': userId} open_json = { 'file': ss.encrypt(json.dumps(file), sessKey), 'ticket': token['ticket'] } open_file = requests.post(ds_url + "open", json=open_json) if open_file.status_code != 200: return opened_files, open_file.text.strip('{}') opened_files.append(open_file.json()) return opened_files, 'File successfully opened.'
def main(): # user login, each new client will be asked to log on, their details will then be stored in the SS database userId = input("Please Enter Username: "******"Please Enter Password: "******"For a list of all possible commands, type HELP.") while connected: cmd = input("Please Enter Command >: ") if cmd == "HELP": get_help() elif cmd == "QUIT": print("Goodbye!") quit(opened_files, dec_lock_token) elif "FIND" in cmd: filename = cmd.split()[1] read_file = requests.get(ds_url + "get_directory/" + filename) print(read_file.text) elif "OPEN" in cmd: filename = cmd.split()[1] opened_files, msg = open(opened_files, filename, userId, dec_dir_token) print(msg) elif "CLOSE" in cmd: filename = cmd.split()[1] opened_files, msg = close(opened_files, filename, dec_lock_token) print(msg) elif "READ" in cmd: filename = cmd.split()[1] file = read(opened_files, filename) print(file) elif "WRITE" in cmd: filename = cmd.split()[1] if len(cmd.split()) > 2: content = cmd.split(' ', 2)[2] msg = write(opened_files, filename, content, dec_dir_token) print(msg) else: print( 'WRITE requires two arguments, <filename> and <updated content>' ) elif "ADD" in cmd: filename = cmd.split()[1] if len(cmd.split()) > 2: filepath = cmd.split(' ', 2)[2] msg = add(filename, filepath, dec_dir_token) print(msg) else: print( 'ADD requires two arguments, <filename> and <file server>' ) elif "LIST" in cmd: if len(opened_files) > 0: print(opened_files) else: print("No files opened.") elif "CHECK" in cmd: filename = cmd.split()[1] check = requests.get(ls_url + "check/" + filename) print(check.text) else: print( "Please provide correct commands, for more information on the commands, type HELP" "\nMake sure to include file extensions in name (i.e. .txt etc)" )