Update 2026-01-20 20:47:44
This commit is contained in:
@@ -244,4 +244,40 @@ def download_zip():
|
||||
@login_required
|
||||
def download_backup_file(date: str, filename: str):
|
||||
backup_path = Path(Config.BACKUP_FOLDER) / date
|
||||
return send_from_directory(str(backup_path), filename, as_attachment=True)
|
||||
return send_from_directory(str(backup_path), filename, as_attachment=True)
|
||||
|
||||
|
||||
@main_bp.route("/move_backup_files", methods=["POST"])
|
||||
@login_required
|
||||
def move_backup_files():
|
||||
data = request.get_json()
|
||||
filename = data.get("filename")
|
||||
source_folder = data.get("source_folder")
|
||||
target_folder = data.get("target_folder")
|
||||
|
||||
if not all([filename, source_folder, target_folder]):
|
||||
return jsonify({"success": False, "message": "필수 파라미터가 누락되었습니다."}), 400
|
||||
|
||||
base_backup = Path(Config.BACKUP_FOLDER)
|
||||
src_path = base_backup / source_folder / filename
|
||||
dst_path = base_backup / target_folder / filename
|
||||
|
||||
# 경로 보안 검사 및 파일 존재 확인
|
||||
try:
|
||||
if not src_path.exists():
|
||||
return jsonify({"success": False, "message": "원본 파일이 존재하지 않습니다."}), 404
|
||||
|
||||
# 상위 경로 탈출 방지 확인 (간단 검증)
|
||||
if ".." in source_folder or ".." in target_folder:
|
||||
return jsonify({"success": False, "message": "잘못된 경로입니다."}), 400
|
||||
|
||||
if not (base_backup / target_folder).exists():
|
||||
return jsonify({"success": False, "message": "대상 폴더가 존재하지 않습니다."}), 404
|
||||
|
||||
shutil.move(str(src_path), str(dst_path))
|
||||
logging.info(f"파일 이동 성공: {filename} from {source_folder} to {target_folder}")
|
||||
return jsonify({"success": True, "message": "파일이 이동되었습니다."})
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"파일 이동 실패: {e}")
|
||||
return jsonify({"success": False, "message": f"이동 중 오류 발생: {str(e)}"}), 500
|
||||
Reference in New Issue
Block a user