WebFM/src/core/routes/Routes.py

187 lines
6.2 KiB
Python
Raw Normal View History

2020-10-11 21:30:11 +00:00
# Python imports
2021-02-06 07:38:15 +00:00
import secrets
2020-10-11 21:30:11 +00:00
# Lib imports
2021-02-06 08:34:44 +00:00
from flask import request, session, render_template, send_from_directory, redirect
2020-10-11 21:30:11 +00:00
from flask_login import current_user
2021-02-06 04:52:46 +00:00
2020-10-11 21:30:11 +00:00
# App imports
2021-02-06 04:52:46 +00:00
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
2020-10-11 21:30:11 +00:00
2021-02-06 07:38:15 +00:00
msgHandler = MessageHandler()
window_controllers = {}
2020-10-11 21:30:11 +00:00
2021-02-06 07:38:15 +00:00
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() } )
2021-02-06 08:34:44 +00:00
return window_controllers[ session["win_controller_id"] ]
2021-02-06 07:38:15 +00:00
2020-10-11 21:30:11 +00:00
@app.route('/', methods=['GET', 'POST'])
def home():
2021-02-06 04:52:46 +00:00
if request.method == 'GET':
2021-02-06 08:34:44 +00:00
view = get_window_controller().get_window(1).get_view(0)
2021-02-06 07:38:15 +00:00
_path = view.get_path()
_files = view.get_files_formatted()
2021-02-06 07:38:15 +00:00
return render_template('pages/index.html', path=_path, files=_files)
2020-10-11 21:30:11 +00:00
2021-02-06 04:52:46 +00:00
return render_template('error.html',
title='Error!',
message='Must use GET request type...')
2020-10-11 21:30:11 +00:00
2021-02-06 07:38:15 +00:00
@app.route('/api/list-files/<_hash>', methods=['GET', 'POST'])
def listFilesRoute(_hash):
2020-10-11 21:30:11 +00:00
if request.method == 'POST':
2021-02-06 07:38:15 +00:00
HASH = _hash.strip()
2020-10-11 21:30:11 +00:00
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
2021-02-06 04:52:46 +00:00
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)
2020-10-11 21:30:11 +00:00
return listFiles(HASH)
else:
msg = "Can't manage the request type..."
return msgHandler.createMessageJSON("danger", msg)
2021-02-06 04:52:46 +00:00
@app.route('/api/get-favorites', methods=['GET', 'POST'])
2020-10-11 21:30:11 +00:00
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)
2021-02-06 04:52:46 +00:00
@app.route('/api/load-favorite/<_id>', methods=['GET', 'POST'])
def loadFavorite(_id):
2020-10-11 21:30:11 +00:00
if request.method == 'POST':
try:
2021-02-06 04:52:46 +00:00
ID = int(_id)
2020-10-11 21:30:11 +00:00
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)
2021-02-06 04:52:46 +00:00
@app.route('/api/manage-favorites/<_action>', methods=['GET', 'POST'])
def manageFavoritesRoute(_action):
2020-10-11 21:30:11 +00:00
if request.method == 'POST':
2021-02-06 04:52:46 +00:00
ACTION = _action.strip()
2020-10-11 22:48:06 +00:00
path = file_manager.getPath()
2020-10-11 21:30:11 +00:00
if ACTION == "add":
2020-10-11 22:48:06 +00:00
fave = Favorites(link=path)
2020-10-11 21:30:11 +00:00
db.session.add(fave)
2020-10-11 22:48:06 +00:00
msg = "Added to Favorites successfully..."
2020-10-11 21:30:11 +00:00
else:
2020-10-11 22:48:06 +00:00
fave = db.session.query(Favorites).filter_by(link=path).first()
2020-10-11 21:30:11 +00:00
db.session.delete(fave)
2020-10-11 22:48:06 +00:00
msg = "Deleted from Favorites successfully..."
2020-10-11 21:30:11 +00:00
db.session.commit()
return msgHandler.createMessageJSON("success", msg)
else:
msg = "Can't manage the request type..."
return msgHandler.createMessageJSON("danger", msg)
2021-02-06 04:52:46 +00:00
@app.route('/api/reset-path', methods=['GET', 'POST'])
2020-10-11 21:30:11 +00:00
def resetPath():
if request.method == 'GET':
2021-02-06 08:34:44 +00:00
view = get_window_controller().get_window(1).get_view(0)
view.set_to_home()
2020-10-11 21:30:11 +00:00
return redirect("/")
# Used to get files from non gunicorn root path...
# Allows us to pull images and stuff to user without simlinking.
2021-02-06 04:52:46 +00:00
@app.route('/api/files/<hash>')
2020-10-11 21:30:11 +00:00
def returnFile(hash):
2021-02-06 08:34:44 +00:00
view = get_window_controller().get_window(1).get_view(0)
folder = view.get_path()
file = view.returnPathPartFromHash(hash)
return send_from_directory(folder, file)
2020-10-11 21:30:11 +00:00
2021-02-06 04:52:46 +00:00
@app.route('/api/remux/<hash>')
2020-10-11 21:30:11 +00:00
def remuxRoute(hash):
2021-02-06 08:34:44 +00:00
view = get_window_controller().get_window(1).get_view(0)
folder = view.get_path()
file = view.returnPathPartFromHash(hash)
fpath = os.path.join(folder, file)
2020-10-11 21:30:11 +00:00
logging.debug(fpath)
2021-02-06 08:34:44 +00:00
return view.remuxVideo(hash, fpath)
2020-10-11 21:30:11 +00:00
2021-02-06 04:52:46 +00:00
@app.route('/api/run-locally/<hash>')
2020-10-11 21:30:11 +00:00
def runLocallyRoute(hash):
2021-02-06 08:34:44 +00:00
view = get_window_controller().get_window(1).get_view(0)
folder = view.get_path()
file = view.returnPathPartFromHash(hash)
fpath = os.path.join(folder, file)
2020-10-11 21:30:11 +00:00
2021-02-06 08:34:44 +00:00
logging.debug(fpath)
view.openFilelocally(fpath)
2021-02-06 04:52:46 +00:00
2020-10-11 21:30:11 +00:00
msg = "Opened media..."
return msgHandler.createMessageJSON("success", msg)
def listFiles(HASH):
state = file_manager.generateLists(HASH)
if "error" in state:
msg = "Listing files failed..."
return msgHandler.createMessageJSON("danger", msg)
path = file_manager.getPath()
fave = db.session.query(Favorites).filter_by(link=path).first()
in_fave = "true" if fave else "false"
dirs = json.dumps( file_manager.getDirs() )
vids = json.dumps( file_manager.getVids() )
imgs = json.dumps( file_manager.getImgs() )
files = json.dumps( file_manager.getFiles() )
return '{"path_head":"' + path + '"' + \
',"in_fave":"' + in_fave + '"' + \
',"list":{"dirs":' + dirs + \
', "vids":' + vids + \
', "imgs":' + imgs + \
', "files":' + files + '}}'