diff --git a/backend/app/api/files.py b/backend/app/api/files.py index b3ac8ab..6e15ecc 100644 --- a/backend/app/api/files.py +++ b/backend/app/api/files.py @@ -421,8 +421,8 @@ def create_share_link(file_id): max_downloads = data.get('max_downloads') permission = data.get('permission', 'read') - if permission not in ('read', 'write'): - return jsonify({'error': 'Berechtigung muss "read" oder "write" sein'}), 400 + if permission not in ('read', 'write', 'upload_only'): + return jsonify({'error': 'Berechtigung muss "read", "write" oder "upload_only" sein'}), 400 token = secrets.token_urlsafe(32) password_hash = None @@ -498,7 +498,8 @@ def share_info(token): 'mime_type': f.mime_type, 'has_password': bool(link.password_hash), 'permission': link.permission, - 'upload_allowed': f.is_folder and link.permission == 'write', + 'upload_allowed': f.is_folder and link.permission in ('write', 'upload_only'), + 'download_allowed': link.permission in ('read', 'write'), }), 200 @@ -531,6 +532,9 @@ def share_download(token): if not link: return jsonify({'error': 'Link nicht gefunden'}), 404 + if link.permission == 'upload_only': + return jsonify({'error': 'Dieser Link erlaubt nur Upload, keinen Download'}), 403 + if link.is_expired(): return jsonify({'error': 'Link abgelaufen'}), 410 @@ -576,9 +580,9 @@ def share_upload(token): if link.is_expired(): return jsonify({'error': 'Link abgelaufen'}), 410 - # Check write permission - if link.permission != 'write': - return jsonify({'error': 'Dieser Link erlaubt nur Lesen'}), 403 + # Check write/upload permission + if link.permission not in ('write', 'upload_only'): + return jsonify({'error': 'Dieser Link erlaubt keinen Upload'}), 403 # Check password if set if link.password_hash: diff --git a/frontend/src/views/FilesView.vue b/frontend/src/views/FilesView.vue index 4b44523..24fb924 100644 --- a/frontend/src/views/FilesView.vue +++ b/frontend/src/views/FilesView.vue @@ -184,7 +184,7 @@
{{ currentOrigin }}/share/{{ link.token }}
- {{ link.permission === 'write' ? 'Lesen+Schreiben' : 'Nur Lesen' }}
+ {{ {read: 'Nur Lesen', write: 'Lesen+Schreiben', upload_only: 'Nur Upload'}[link.permission] || link.permission }}
| {{ link.download_count }} Downloads
| Bis {{ formatDate(link.expires_at) }}
| Passwortgeschuetzt
@@ -255,7 +255,11 @@ const selectedShareUser = ref(null)
const shareUserPermission = ref('read')
const userSearchResults = ref([])
const userPermOptions = [{ label: 'Lesen', value: 'read' }, { label: 'Schreiben', value: 'write' }, { label: 'Admin', value: 'admin' }]
-const linkPermOptions = [{ label: 'Nur Lesen (Download)', value: 'read' }, { label: 'Lesen + Hochladen (nur Ordner)', value: 'write' }]
+const linkPermOptions = [
+ { label: 'Nur Lesen (Download)', value: 'read' },
+ { label: 'Lesen + Hochladen (nur Ordner)', value: 'write' },
+ { label: 'Nur Upload (Ordner, kein Einblick)', value: 'upload_only' },
+]
const shareLinkPermission = ref('read')
const currentOrigin = window.location.origin
const shareLoading = ref(false)
diff --git a/frontend/src/views/ShareView.vue b/frontend/src/views/ShareView.vue
index da6e984..ed78bc1 100644
--- a/frontend/src/views/ShareView.vue
+++ b/frontend/src/views/ShareView.vue
@@ -14,9 +14,10 @@