# Python imports import secrets # Lib imports from flask import request, session, render_template, send_from_directory, redirect from flask_login import current_user # App imports from core import app, logger, oidc, db # Get from __init__ from core.utils import MessageHandler # Get simple message processor from core.utils.shellfm import WindowController # Get file manager controller msgHandler = MessageHandler() window_controllers = {} def get_window_controller(): if session.get('win_controller_id') is None: id = secrets.token_hex(16) session['win_controller_id'] = id window_controllers.update( {id: WindowController() } ) return window_controllers[ session["win_controller_id"] ] @app.route('/', methods=['GET', 'POST']) def home(): if request.method == 'GET': view = get_window_controller().get_window(1).get_view(0) _dot_dots = view.get_dot_dots() _current_directory = view.get_current_directory() return render_template('pages/index.html', current_directory = _current_directory, dot_dots = _dot_dots) return render_template('error.html', title = 'Error!', message = 'Must use GET request type...') @app.route('/api/list-files/<_hash>', methods=['GET', 'POST']) def listFilesRoute(_hash): if request.method == 'POST': view = get_window_controller().get_window(1).get_view(0) files = view.get_files_formatted() _path = view.get_path() _files = view.get_files_formatted() fave = db.session.query(Favorites).filter_by(link=path).first() in_fave = "true" if fave else "false" files.update({'in_fave': in_fave}) return files # HASH = _hash.strip() # pathPart = file_manager.returnPathPartFromHash(HASH) # lockedFolders = config["settings"]["locked_folders"].split("::::") # path = file_manager.getPath().split('/') # lockedFolderInPath = False # # # Insure chilren folders are locked too. # for folder in lockedFolders: # if folder in path: # lockedFolderInPath = True # break # # isALockedFolder = (pathPart in lockedFolders or lockedFolderInPath) # msg = "Log in with an Admin privlidged user to view the requested path!" # if isALockedFolder and not oidc.user_loggedin: # return msgHandler.createMessageJSON("danger", msg) # elif isALockedFolder and oidc.user_loggedin: # isAdmin = oidc.user_getfield("isAdmin") # if isAdmin != "yes" : # return msgHandler.createMessageJSON("danger", msg) # # return listFiles(HASH) else: msg = "Can't manage the request type..." return msgHandler.createMessageJSON("danger", msg) @app.route('/api/file-manager-action/<_type>/<_hash>') def file_manager_action(_type, _hash = None): view = get_window_controller().get_window(1).get_view(0) if _type == "reset-path" and _hash == None: view.set_to_home() return redirect("/") folder = view.get_path() file = view.returnPathPartFromHash(hash) fpath = os.path.join(folder, file) logging.debug(fpath) if _type == "files": return send_from_directory(folder, file) if _type == "remux": # NOTE: Need to actually implimint a websocket to communicate back to client that remux has completed. # As is, the remux thread hangs until completion and client tries waiting until server reaches connection timeout. # I.E....this is stupid but for now works return view.remuxVideo(hash, fpath) if _type == "run-locally": view.openFilelocally(fpath) return msgHandler.createMessageJSON("success", msg) @app.route('/api/get-favorites', methods=['GET', 'POST']) def getAllFavoritesRoute(): if request.method == 'POST': list = db.session.query(Favorites).all() faves = [] for fave in list: faves.append([fave.link, fave.id]) return '{"faves_list":' + json.dumps(faves) + '}' else: msg = "Can't manage the request type..." return msgHandler.createMessageJSON("danger", msg) @app.route('/api/load-favorite/<_id>', methods=['GET', 'POST']) def loadFavorite(_id): if request.method == 'POST': try: ID = int(_id) fave = db.session.query(Favorites).filter_by(id=ID).first() file_manager.setNewPathFromFavorites(fave.link) file_manager.loadPreviousPath() return '{"refresh":"true"}' except Exception as e: print(repr(e)) msg = "Incorrect Favorites ID..." return msgHandler.createMessageJSON("danger", msg) else: msg = "Can't manage the request type..." return msgHandler.createMessageJSON("danger", msg) @app.route('/api/manage-favorites/<_action>', methods=['GET', 'POST']) def manageFavoritesRoute(_action): if request.method == 'POST': ACTION = _action.strip() path = file_manager.getPath() if ACTION == "add": fave = Favorites(link=path) db.session.add(fave) msg = "Added to Favorites successfully..." else: fave = db.session.query(Favorites).filter_by(link=path).first() db.session.delete(fave) msg = "Deleted from Favorites successfully..." db.session.commit() return msgHandler.createMessageJSON("success", msg) else: msg = "Can't manage the request type..." return msgHandler.createMessageJSON("danger", msg)