mirror of
https://github.com/agent0ai/agent-zero.git
synced 2026-05-06 08:01:31 +00:00
commit8ec3b24696Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Dec 8 00:17:02 2024 +0100 keyboard input tool commita76a302f3fAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Sat Dec 7 23:28:03 2024 +0100 solutions cleanup commit884007cdb0Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sat Dec 7 21:51:14 2024 +0100 console print edits for docker commit927c234d69Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sat Dec 7 20:40:28 2024 +0100 openai azure model func name fix commit53a46288f9Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 15:17:58 2024 +0100 mistral fix, error text output commit6aa37744fcAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 14:58:10 2024 +0100 toast fix commitf0be03ea77Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 14:33:28 2024 +0100 toast errors commit8434682812Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 11:30:34 2024 +0100 warnings cleanup commit2b94af895dAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 10:54:06 2024 +0100 Preload fix commit7f270d4a14Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 09:44:13 2024 +0100 Server startup log msg commitf9c9b5c933Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 07:50:15 2024 +0100 Update run_ui.py commitf3ca7e0742Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Dec 6 06:21:14 2024 +0100 Update run_ui.py commit21975c5a7cAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Dec 5 20:45:51 2024 +0100 local models docker url commitf0a8b07c4fAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Dec 5 16:40:49 2024 +0100 Server addr notice commit656612726aMerge:49594fe7c2866cAuthor: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Thu Dec 5 16:11:23 2024 +0100 Merge pull request #260 from 3clyp50/development fix: toast handling, mobile breakpoint commit7c2866ca61Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Dec 4 19:37:50 2024 +0100 fix: toast handling, mobile breakpoint `toast.css` and `index.js` - fixed toasts disappearing right after showing - simplified toast animation `index.css` - set 2ⁿᵈ mobile breakpoint at 640px commit49594fe6ecMerge:f69775470b1fa3Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Wed Dec 4 10:39:58 2024 +0100 Merge pull request #259 from 3clyp50/development CSS refactor and toasts commit70b1fa385aAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Dec 4 02:17:50 2024 +0100 refactor: css, style: toasts, fix: z-index - organized structure - consolidated selectors and states - shorthand everywhere - modern toasts - bigger action buttons for mobile commitf6977546c1Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 22:42:36 2024 +0100 call subordinate fix commitfbe47ac03eAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 21:19:03 2024 +0100 Minor fixes commit961dbc405aAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 21:10:45 2024 +0100 restart commit357909c16aAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 19:41:29 2024 +0100 whisper remote preload commite0b0b6f636Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 17:39:56 2024 +0100 nudge commit9fae02b2a5Merge:0ebc142fedf2d4Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 14:57:18 2024 +0100 Merge pull request #256 from 3clyp50/development feature: copy text button, nudge & fix: various styles commit0ebc142124Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 14:56:33 2024 +0100 ssh connection retry commitdeae13d383Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 14:38:57 2024 +0100 root pass fix commit9109fcbf60Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 14:28:53 2024 +0100 root password change fix commit46689d6477Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Dec 3 14:22:18 2024 +0100 RFC & SSH exchange for development commitfedf2d4bdcAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Tue Dec 3 04:03:14 2024 +0100 feature: copy text button, nudge & fix: various styles - Copy button for all messages - Nudge button front-end - Fixed various non-styled light mode elements to do -> css cleanup and whisper loading commit19f50d6d95Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Dec 1 20:50:17 2024 +0100 attachments, files, prompt extras, prompt caching, refactors, cleanups commitc99b1a47d4Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 29 08:55:27 2024 +0100 Alpine fix version, STT fixes commit81e653ba2dMerge:857f8b689b8483Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Thu Nov 28 23:08:09 2024 +0100 Merge pull request #255 from 3clyp50/development feature: speech to text settings commit857f8b6d82Author: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Nov 28 23:05:17 2024 +0100 download and remove folders in browser commit89b848312bAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Thu Nov 28 16:07:50 2024 +0100 feature: speech to text settings - initial commit: voice settings - Settings section for STT commitb3a27bb442Merge:5e8d6b1bb980eaAuthor: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Thu Nov 28 08:39:01 2024 +0100 Merge pull request #254 from 3clyp50/development fix: file browser bugs + final ui polishing commitbb980ea6b9Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Thu Nov 28 01:13:56 2024 +0100 fix: file browser deletion bug + parent directory Underscore matters! - fixed both bugs for the browser Extra: - style for toasts quickfix generic modals commitf0126a6ef8Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Nov 27 23:44:20 2024 +0100 style: polishing and consistency commit5e8d6b1c7dAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Wed Nov 27 22:16:13 2024 +0100 Minor fixes commit184f8dcf53Author: frdel <38891707+frdel@users.noreply.github.com> Date: Wed Nov 27 22:05:23 2024 +0100 Pause button fix commit969f142af1Author: frdel <38891707+frdel@users.noreply.github.com> Date: Wed Nov 27 22:01:06 2024 +0100 RFC fix, history bugfixes commit733b8de516Merge:f2057d36a83e79Author: frdel <38891707+frdel@users.noreply.github.com> Date: Wed Nov 27 20:57:15 2024 +0100 Merge branch 'pr/253' into development commit6a83e79d5aAuthor: Alessandro <real.eclypso@gmail.com> Date: Wed Nov 27 20:41:53 2024 +0100 fix: bigger modals commitf2057d3901Author: frdel <38891707+frdel@users.noreply.github.com> Date: Wed Nov 27 17:30:19 2024 +0100 Squashed commit of the following: commite626817332Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Nov 27 12:51:22 2024 +0100 refactor: modals css Modals now get the base styles from modals.css, with any spec in the individual files (settings.css, file_manager.css, ecc). commit306db0ca39Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Nov 27 03:17:20 2024 +0100 style: new action buttons + ghost buttons Updated styles for buttons, switches, and overall UI graphic improvement commitc95a379bb5Author: Alessandro <real.eclypso@gmail.com> Date: Tue Nov 26 20:17:18 2024 +0100 fix: status-icon commiteddafa8798Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Fri Nov 22 01:28:04 2024 +0100 cleanup: webui folder cleanup (history) cleanup: webui sidebar, icons, modals commite626817332Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Nov 27 12:51:22 2024 +0100 refactor: modals css Modals now get the base styles from modals.css, with any spec in the individual files (settings.css, file_manager.css, ecc). commit306db0ca39Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Nov 27 03:17:20 2024 +0100 style: new action buttons + ghost buttons Updated styles for buttons, switches, and overall UI graphic improvement commitc95a379bb5Author: Alessandro <real.eclypso@gmail.com> Date: Tue Nov 26 20:17:18 2024 +0100 fix: status-icon commiteddafa8798Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Fri Nov 22 01:28:04 2024 +0100 cleanup: webui folder cleanup (history) cleanup: webui sidebar, icons, modals commit22ecfd660cAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 25 22:14:17 2024 +0100 intervention message fix commitea9c8bf63bAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 25 20:48:52 2024 +0100 minor context window fixes commit489ca317c5Author: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 25 19:01:01 2024 +0100 settings auth fix commita0ff118ad1Author: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 25 17:39:42 2024 +0100 Context window management, work in progress commitc0947e30c7Author: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Nov 21 18:47:40 2024 +0100 API separation commit8db8d3fa18Merge:50348920735bb9Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Thu Nov 21 15:29:20 2024 +0100 Merge pull request #249 from 3clyp50/development feature: work_dir file manager commit0735bb9ae8Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Thu Nov 21 11:28:56 2024 +0100 fix: SVG optimization Thanks SVGO! removal: settings.svg (not used) commit9c968ba1cfAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Thu Nov 21 10:58:20 2024 +0100 feature: work_dir file manager Implemented the file browser for work_dir, we need to: - move endpoints away from run_ui.py - make the "Up" (parent dir) button work Extra: - Now when under 768px in width, you can touch outside of the sidebar to collapse it. commit50348926dfAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 21:56:50 2024 +0100 version info fix commit040de30ef2Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 21:21:47 2024 +0100 removed bundles, tests commit020c16ef86Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 20:46:08 2024 +0100 git+docker improvements version, build branch commit06260ed4a6Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 13:11:54 2024 +0100 searxng fix, ui animation commit41dc7ae146Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 11:05:33 2024 +0100 Nodejs eval require path fix commit970db9adc9Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 10:37:49 2024 +0100 Whisper fix commitf59ac2b485Author: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 09:34:00 2024 +0100 docker /a0 mount fix commitc7046fa97bAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 00:43:15 2024 +0100 docker volume map fix commit0ce8344f0bAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Nov 19 00:23:08 2024 +0100 dockerfile, compose, smart cache commitbad3951646Author: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 18 21:41:39 2024 +0100 RFC error messages commit05cbaa0f4dAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 18 21:16:50 2024 +0100 RFC password RFC password protection work in progress commit9d1d2be897Author: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 18 16:18:31 2024 +0100 Dockerfile updates commita7a40ac18fAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 18 10:50:24 2024 +0100 dotenv fix, knowledge tool fic commitba3422d452Author: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 18 09:01:23 2024 +0100 dotenv fix, gitignore update commit9c7339042fAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Nov 17 23:12:19 2024 +0100 Squashed commit of the following: commit b05d44bb4bc9e07cfc0b584ab39e8624bae771fb Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Nov 17 23:12:00 2024 +0100 searxng, RFC, docker runtime commit c90fd4026e644d22e6c7dc29639c85eee6026828 Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sat Nov 16 21:21:49 2024 +0100 Remote function calling commit f71d45ec7dbff4e2d3209f0efe97804f6e602fe7 Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 13:13:09 2024 +0100 Fix for bool arg parsing commit 936768d1d8efc9060494334b87f400c933d78048 Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 13:01:28 2024 +0100 Dynamic runtime args parsing commit 00c915fc6c1f8f00f8176fbf5b77af32fa312d18 Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 12:13:58 2024 +0100 API key fix commit 504a7f91789caa16578af8bae9b7936a9d7fbbb7 Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 11:59:41 2024 +0100 API keys JIT loading commit 5678a2fce2d333454bb1a2e94ca2b5916d321b41 Author: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 11:27:12 2024 +0100 Update dotenv.py commite469f6d7baAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 09:57:49 2024 +0100 Docker runtime preload commit66f1ab7bafAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Fri Nov 15 09:49:23 2024 +0100 Docker runtime - SSH, runtime args commit02cb41b2fdAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Nov 14 21:49:45 2024 +0100 WIP: docker runtime commitb33b48057dAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Nov 14 21:28:14 2024 +0100 WIP: docker runtime commit7fc17b39c5Author: frdel <38891707+frdel@users.noreply.github.com> Date: Thu Nov 14 20:27:43 2024 +0100 Docker runtime in progress work in progress container manager script runtime image with autostart commit2bf24b76d9Merge:92d94b4a57f0c1Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Tue Nov 12 15:38:30 2024 +0100 Merge pull request #239 from 3clyp50/development feature: attachments preview and sending (file, code, imgs) commita57f0c1198Author: Alessandro <real.eclypso@gmail.com> Date: Tue Nov 12 15:02:25 2024 +0100 feature: attachments preview and sending (file, code, imgs) commit92d94b4d86Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Nov 10 23:44:15 2024 +0100 TTS prototype TTS with default browser API commit1a91334a42Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Nov 10 20:57:49 2024 +0100 STT continued Dialogue mode and state managed for STT commit22f1a2b744Author: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Nov 10 14:25:20 2024 +0100 speech recognition prototype using xenova web only tts commita0b042cfb2Merge:22db39f82ca0d8Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Sun Nov 10 08:52:32 2024 +0100 Merge pull request #235 from 3clyp50/development feature: openai-whisper voice input commit22db39f731Merge:d39beba2b1aa09Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Sun Nov 10 08:52:15 2024 +0100 Merge pull request #236 from linuztx/development Add Free Cloudflare Tunnel Support for Remote Access commit2b1aa09840Author: linuztx <linuztx@gmail.com> Date: Sun Nov 10 14:56:52 2024 +0800 Add auto-downloading cloudflared tunnel manager commitcca85d7f5dAuthor: linuztx <linuztx@gmail.com> Date: Sun Nov 10 14:54:52 2024 +0800 Integrate Cloudflare tunnel support in web UI commit433f44522cAuthor: linuztx <linuztx@gmail.com> Date: Sun Nov 10 14:54:19 2024 +0800 Add USE_CLOUDFLARE environment variable commitd94c3b0467Author: linuztx <linuztx@gmail.com> Date: Sun Nov 10 14:53:45 2024 +0800 Cloudflared binaries commit451fdb08c4Author: linuztx <linuztx@gmail.com> Date: Sun Nov 10 14:52:24 2024 +0800 Add bin directory for cloudflared downloads commit82ca0d800aAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Sun Nov 10 00:37:41 2024 +0100 feature: openai-whisper voice input This also reverts commit 92a904d4411a203c482bc1231dee1438d7279b62. commit3c6a5bee64Author: Alessandro <real.eclypso@gmail.com> Date: Fri Nov 8 01:46:29 2024 +0100 feature: attachment setup missing - double user message when sending imgs - base 64 images implementation fix: fonts consistency commitd39beba374Merge:2eb497c9d6b769Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Thu Nov 7 08:31:52 2024 +0100 Merge pull request #234 from 3clyp50/development UI Knowledge import, attachments, voice input and scroll fix commit9d6b769dc2Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Thu Nov 7 05:40:40 2024 +0100 UI Knowledge import missing - image attachment - work_dir browser (backend implemented, WIP) - WHISPER (hurry up) commit3c40c86d07Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Thu Nov 7 03:40:06 2024 +0100 Revert index.js scrolling logic + css infinite scroll fix commitd84469dff6Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Nov 6 11:17:56 2024 +0100 Mic js and embedding menu + styles commit2eb497c8d2Merge:ef1cdac21933bcAuthor: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Tue Nov 5 21:33:32 2024 +0100 Merge pull request #233 from 3clyp50/development Animation, KaTeX fix and mobile improvements commit21933bce2fAuthor: Alessandro <real.eclypso@gmail.com> Date: Tue Nov 5 21:07:50 2024 +0100 KaTeX fix and mobile improvements commitef1cdacea2Merge:9626c04553f7bfAuthor: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Tue Nov 5 17:54:14 2024 +0100 Merge pull request #232 from 3clyp50/development LaTeX, old browser support, new buttons and attachments commit553f7bf039Merge:fc03a799626c04Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Tue Nov 5 14:48:53 2024 +0100 Merge remote-tracking branch 'upstream/development' into development commitfc03a7922eAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Tue Nov 5 00:59:25 2024 +0100 Browsers support, new text buttons + attachments - Firefox/old browsers support and new text buttons + attachments - LaTeX support! commit9626c044d5Author: frdel <38891707+frdel@users.noreply.github.com> Date: Mon Nov 4 22:55:56 2024 +0100 UI and settings merge commit255baf0780Merge:1c026ee61b5b83Author: Jan Tomášek <38891707+frdel@users.noreply.github.com> Date: Mon Nov 4 22:26:57 2024 +0100 Merge pull request #229 from 3clyp50/development UI update commit61b5b8389aAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Mon Nov 4 22:26:07 2024 +0100 other things + Embedding Model selection commit6ff3df03deAuthor: Alessandro <real.eclypso@gmail.com> Date: Mon Nov 4 21:06:48 2024 +0100 toast! commite6ac772a2eAuthor: Alessandro <real.eclypso@gmail.com> Date: Mon Nov 4 20:58:55 2024 +0100 Mobile and UX update commit1a0ceebcafAuthor: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Mon Nov 4 15:18:06 2024 +0100 Modal styling WIP commitf28a05d739Author: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Wed Oct 23 00:18:59 2024 +0200 Improved UI/UX in WebUI - Collapsible pref section 👍 - Monospace font - UX focus on user feedback and accessibility - Mobile and input section QoL - Other minor refinements commit1c026ee75fAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Tue Oct 29 19:39:54 2024 +0100 Behaviour prompt Prototype of adjustable behaviour system prompt commita5d671904dAuthor: frdel <38891707+frdel@users.noreply.github.com> Date: Sun Oct 27 18:04:40 2024 +0100 Settings prototype Settings modal window managed from python - work in progress
192 lines
No EOL
7.2 KiB
Python
192 lines
No EOL
7.2 KiB
Python
import os
|
|
from pathlib import Path
|
|
import shutil
|
|
import tempfile
|
|
from typing import Dict, List, Tuple, Optional, Any
|
|
import zipfile
|
|
from werkzeug.utils import secure_filename
|
|
from datetime import datetime
|
|
|
|
from python.helpers import files, runtime
|
|
from python.helpers.print_style import PrintStyle
|
|
|
|
class FileBrowser:
|
|
ALLOWED_EXTENSIONS = {
|
|
'image': {'jpg', 'jpeg', 'png', 'bmp'},
|
|
'code': {'py', 'js', 'sh', 'html', 'css'},
|
|
'document': {'md', 'pdf', 'txt', 'csv', 'json'}
|
|
}
|
|
|
|
MAX_FILE_SIZE = 100 * 1024 * 1024 # 100MB
|
|
|
|
def __init__(self):
|
|
if runtime.is_development():
|
|
base_dir = files.get_base_dir()
|
|
else:
|
|
base_dir = "/"
|
|
self.base_dir = Path(base_dir)
|
|
|
|
def _check_file_size(self, file) -> bool:
|
|
try:
|
|
file.seek(0, os.SEEK_END)
|
|
size = file.tell()
|
|
file.seek(0)
|
|
return size <= self.MAX_FILE_SIZE
|
|
except (AttributeError, IOError):
|
|
return False
|
|
|
|
def save_files(self, files: List, current_path: str = "") -> Tuple[List[str], List[str]]:
|
|
"""Save uploaded files and return successful and failed filenames"""
|
|
successful = []
|
|
failed = []
|
|
|
|
try:
|
|
# Resolve the target directory path
|
|
target_dir = (self.base_dir / current_path).resolve()
|
|
if not str(target_dir).startswith(str(self.base_dir)):
|
|
raise ValueError("Invalid target directory")
|
|
|
|
os.makedirs(target_dir, exist_ok=True)
|
|
|
|
for file in files:
|
|
try:
|
|
if file and self._is_allowed_file(file.filename, file):
|
|
filename = secure_filename(file.filename)
|
|
file_path = target_dir / filename
|
|
|
|
file.save(str(file_path))
|
|
successful.append(filename)
|
|
else:
|
|
failed.append(file.filename)
|
|
except Exception as e:
|
|
PrintStyle.error(f"Error saving file {file.filename}: {e}")
|
|
failed.append(file.filename)
|
|
|
|
return successful, failed
|
|
|
|
except Exception as e:
|
|
PrintStyle.error(f"Error in save_files: {e}")
|
|
return successful, failed
|
|
|
|
def delete_file(self, file_path: str) -> bool:
|
|
"""Delete a file or empty directory"""
|
|
try:
|
|
# Resolve the full path while preventing directory traversal
|
|
full_path = (self.base_dir / file_path).resolve()
|
|
if not str(full_path).startswith(str(self.base_dir)):
|
|
raise ValueError("Invalid path")
|
|
|
|
if os.path.exists(full_path):
|
|
if os.path.isfile(full_path):
|
|
os.remove(full_path)
|
|
elif os.path.isdir(full_path):
|
|
shutil.rmtree(full_path)
|
|
return True
|
|
|
|
return False
|
|
|
|
except Exception as e:
|
|
PrintStyle.error(f"Error deleting {file_path}: {e}")
|
|
return False
|
|
|
|
def _is_allowed_file(self, filename: str, file) -> bool:
|
|
# allow any file to be uploaded in file browser
|
|
|
|
# if not filename:
|
|
# return False
|
|
# ext = self._get_file_extension(filename)
|
|
# all_allowed = set().union(*self.ALLOWED_EXTENSIONS.values())
|
|
# if ext not in all_allowed:
|
|
# return False
|
|
|
|
return True # Allow the file if it passes the checks
|
|
|
|
def _get_file_extension(self, filename: str) -> str:
|
|
return filename.rsplit('.', 1)[1].lower() if '.' in filename else ''
|
|
|
|
def get_files(self, current_path: str = "") -> Dict:
|
|
try:
|
|
# Resolve the full path while preventing directory traversal
|
|
full_path = (self.base_dir / current_path).resolve()
|
|
if not str(full_path).startswith(str(self.base_dir)):
|
|
raise ValueError("Invalid path")
|
|
|
|
files = []
|
|
folders = []
|
|
|
|
# List all entries in the current directory
|
|
for entry in os.scandir(full_path):
|
|
entry_data: Dict[str, Any] = {
|
|
"name": entry.name,
|
|
"path": str(Path(entry.path).relative_to(self.base_dir)),
|
|
"modified": datetime.fromtimestamp(entry.stat().st_mtime).isoformat()
|
|
}
|
|
|
|
if entry.is_file():
|
|
entry_data.update({
|
|
"type": self._get_file_type(entry.name),
|
|
"size": entry.stat().st_size,
|
|
"is_dir": False
|
|
})
|
|
files.append(entry_data)
|
|
else:
|
|
entry_data.update({
|
|
"type": "folder",
|
|
"size": 0, # Directories show as 0 bytes
|
|
"is_dir": True
|
|
})
|
|
folders.append(entry_data)
|
|
|
|
# Combine folders and files, folders first
|
|
all_entries = folders + files
|
|
|
|
# Get parent directory path if not at root
|
|
parent_path = ""
|
|
if current_path:
|
|
try:
|
|
# Get the absolute path of current directory
|
|
current_abs = (self.base_dir / current_path).resolve()
|
|
|
|
# parent_path is empty only if we're already at root
|
|
if str(current_abs) != str(self.base_dir):
|
|
parent_path = str(Path(current_path).parent)
|
|
|
|
except Exception as e:
|
|
parent_path = ""
|
|
|
|
return {
|
|
"entries": all_entries,
|
|
"current_path": current_path,
|
|
"parent_path": parent_path
|
|
}
|
|
|
|
except Exception as e:
|
|
PrintStyle.error(f"Error reading directory: {e}")
|
|
return {"entries": [], "current_path": "", "parent_path": ""}
|
|
|
|
def get_full_path(self, file_path: str, allow_dir: bool = False) -> str:
|
|
"""Get full file path if it exists and is within base_dir"""
|
|
full_path = files.get_abs_path(self.base_dir,file_path)
|
|
if not files.exists(full_path):
|
|
raise ValueError(f"File {file_path} not found")
|
|
return full_path
|
|
|
|
def _get_file_type(self, filename: str) -> str:
|
|
ext = self._get_file_extension(filename)
|
|
for file_type, extensions in self.ALLOWED_EXTENSIONS.items():
|
|
if ext in extensions:
|
|
return file_type
|
|
return 'unknown'
|
|
|
|
def zip_dir(self, dir_path: str):
|
|
full_path = self.get_full_path(dir_path, allow_dir=True)
|
|
zip_file_path = tempfile.NamedTemporaryFile(suffix='.zip', delete=False).name
|
|
base_name = os.path.basename(full_path)
|
|
with zipfile.ZipFile(zip_file_path, "w", compression=zipfile.ZIP_DEFLATED) as zip:
|
|
for root, _, files in os.walk(full_path):
|
|
for file in files:
|
|
file_path = os.path.join(root, file)
|
|
rel_path = os.path.relpath(file_path, full_path)
|
|
zip.write(file_path, os.path.join(base_name, rel_path))
|
|
return zip_file_path
|
|
|