diff --git a/resources/vue/components/courseware/CoursewareAudioBlock.vue b/resources/vue/components/courseware/CoursewareAudioBlock.vue
index 6d3619d2f89fcd4be36a796fc5b8b28a0b519fdc..70af59689bf719683c68cbc9d2832278d14dc600 100755
--- a/resources/vue/components/courseware/CoursewareAudioBlock.vue
+++ b/resources/vue/components/courseware/CoursewareAudioBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="currentTitle !== ''" class="cw-block-title">{{ currentTitle }}</div>
                 <audio
                     :src="currentURL"
@@ -60,7 +63,7 @@
                         <p><translate>Es ist keine Audio-Datei verfügbar</translate></p>
                     </div>
                     <div v-if="showRecorder && canGetMediaDevices" class="cw-audio-playlist-recorder">
-                        <button 
+                        <button
                             v-show="!userRecorderEnabled"
                             class="button"
                             @click="enableRecorder"
@@ -81,21 +84,21 @@
                         >
                             <translate>Aufnahme wiederholen</translate>
                         </button>
-                        <button 
+                        <button
                             v-show="isRecording"
                             class="button"
                             @click="stopRecording"
                         >
                             <translate>Aufnahme beenden</translate>
                         </button>
-                        <button 
+                        <button
                             v-show="newRecording && !isRecording"
                             class="button"
                             @click="resetRecorder"
                         >
                             <translate>Aufnahme löschen</translate>
                         </button>
-                        <button 
+                        <button
                             v-show="newRecording && !isRecording"
                             class="button"
                             @click="storeRecording"
@@ -158,11 +161,13 @@
 import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import CoursewareFolderChooser from './CoursewareFolderChooser.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-audio-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -215,7 +220,7 @@ export default {
                 .filter((file) => {
                     if (this.relatedTermOfUse({parent: file, relationship: 'terms-of-use'}).attributes['download-condition'] !== 0) {
                         return false;
-                    } 
+                    }
                     if (! file.attributes['mime-type'].includes('audio')) {
                         return false;
                     }
@@ -578,7 +583,8 @@ export default {
         },
     },
     watch: {
-        currentFolderId() {
+        currentFolderId(value) {
+            this.validateFolderAccessibility(value);
             this.getFolderFiles();
         },
     },
diff --git a/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue b/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue
index e8d7f91dd27c1543bfdec408d59314d7c65f8d8b..6a3c5979863fb82c4aea49ac30e5fc000ab328d1 100755
--- a/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue
+++ b/resources/vue/components/courseware/CoursewareBeforeAfterBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <TwentyTwenty :before="currentBeforeUrl" :after="currentAfterUrl" />
             </template>
             <template v-if="canEdit" #edit>
@@ -64,9 +67,11 @@ import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import TwentyTwenty from 'vue-twentytwenty';
 import 'vue-twentytwenty/dist/vue-twentytwenty.css';
 import { mapActions } from 'vuex';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 export default {
     name: 'courseware-before-after-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -227,5 +232,17 @@ export default {
             }
         },
     },
+    watch: {
+        currentBeforeFile(value) {
+            if (value?.relationships?.parent && value.relationships.parent.data.type == 'folders') {
+                this.validateFolderAccessibility(value.relationships.parent.data.id);
+            }
+        },
+        currentAfterFile(value) {
+            if (value?.relationships?.parent && value.relationships.parent.data.type == 'folders') {
+                this.validateFolderAccessibility(value.relationships.parent.data.id);
+            }
+        }
+    }
 };
 </script>
diff --git a/resources/vue/components/courseware/CoursewareCanvasBlock.vue b/resources/vue/components/courseware/CoursewareCanvasBlock.vue
index 008dcc75bff8b5f970d55a2f654d094a73baa1a0..6b290c6fd5dc1a915e804517c71af1dc56c8ad94 100755
--- a/resources/vue/components/courseware/CoursewareCanvasBlock.vue
+++ b/resources/vue/components/courseware/CoursewareCanvasBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="currentTitle" class="cw-block-title">
                     {{ currentTitle }}
                 </div>
@@ -146,11 +149,13 @@
 import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import CoursewareFolderChooser from './CoursewareFolderChooser.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-canvas-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -595,5 +600,15 @@ export default {
             }
         },
     },
+    watch: {
+        currentFile(value) {
+            if (value?.relationships?.parent && value.relationships.parent.data.type == 'folders') {
+                this.validateFolderAccessibility(value.relationships.parent.data.id);
+            }
+        },
+        currentUploadFolderId(value) {
+            this.validateFolderAccessibility(value);
+        }
+    },
 };
 </script>
diff --git a/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue b/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue
index 8feeb60c768e176dd72873c2c792c9d4d7c8f933..e50dea5bc20a493e89c36909204c09bc5e8f2570 100755
--- a/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue
+++ b/resources/vue/components/courseware/CoursewareDialogCardsBlock.vue
@@ -9,8 +9,11 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div class="cw-block-dialog-cards-content">
-                    <button 
+                    <button
                         class="cw-dialogcards-prev cw-dialogcards-navbutton"
                         :class="{'cw-dialogcards-prev-disabled': hasNoPerv}"
                         @click="prevCard"
@@ -66,7 +69,7 @@
                         :name="$gettext('Karte') +  ' ' + (index + 1).toString()"
                         :selected="index === 0"
                         canBeEmpty
-                    > 
+                    >
                         <form class="default" @submit.prevent="">
                             <label>
                                 <translate>Bild Vorderseite</translate>:
@@ -113,12 +116,14 @@ import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import CoursewareTabs from './CoursewareTabs.vue';
 import CoursewareTab from './CoursewareTab.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions } from 'vuex';
 import StudipIcon from '../StudipIcon.vue';
 
 export default {
     name: 'courseware-dialog-cards-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -261,5 +266,20 @@ export default {
             });
         },
     },
+    watch: {
+        currentCards: {
+            handler(value) {
+                value.forEach((card) => {
+                    if (card?.front_file?.folder_id) {
+                        this.validateFolderAccessibility(card.front_file.folder_id);
+                    }
+                    if (card?.back_file?.folder_id) {
+                        this.validateFolderAccessibility(card.back_file.folder_id);
+                    }
+                });
+            },
+            deep: true
+        }
+    },
 };
 </script>
diff --git a/resources/vue/components/courseware/CoursewareDocumentBlock.vue b/resources/vue/components/courseware/CoursewareDocumentBlock.vue
index 1967387990f0e76e7f297e817881984bd072c191..de7d57e9b3c75d9cabaa3383d303792c3381345d 100755
--- a/resources/vue/components/courseware/CoursewareDocumentBlock.vue
+++ b/resources/vue/components/courseware/CoursewareDocumentBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="hasFile" class="cw-pdf-header cw-block-title">
                     <button class="cw-pdf-button-prev" :class="{ inactive: pageNum - 1 === 0 }" @click="prevPage" />
                     <span class="cw-pdf-title">{{ currentTitle }}</span>
@@ -71,11 +74,13 @@ import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import * as pdfjsLib from 'pdfjs-dist';
 import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions } from 'vuex';
 
 export default {
     name: 'courseware-document-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -137,6 +142,11 @@ export default {
                 this.evaluateBrowseAction();
             }
         },
+        currentFile(value) {
+            if (value?.relationships?.parent && value.relationships.parent.data.type == 'folders') {
+                this.validateFolderAccessibility(value.relationships.parent.data.id);
+            }
+        }
     },
     mounted() {
         this.loadFileRefs(this.block.id).then((response) => {
diff --git a/resources/vue/components/courseware/CoursewareDownloadBlock.vue b/resources/vue/components/courseware/CoursewareDownloadBlock.vue
index 238e005bafe8ea4a255ea808404656184e9758a1..ea8d8ceb7cc972d35fabddfac13c35f69b9db506 100755
--- a/resources/vue/components/courseware/CoursewareDownloadBlock.vue
+++ b/resources/vue/components/courseware/CoursewareDownloadBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="currentTitle !== ''" class="cw-block-title">{{ currentTitle }}</div>
                 <div v-if="currentFile !== null" class="cw-block-download-content">
                     <div v-if="currentInfo !== '' && !userHasDownloaded" class="messagebox messagebox_info">
@@ -71,11 +74,13 @@
 <script>
 import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-download-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -151,6 +156,8 @@ export default {
                         { type: 0, file_id: fileRef.id, file_name: fileRef.attributes.name },
                         true
                     ),
+                    folder_id: fileRef?.relationships?.parent && fileRef.relationships.parent.data.type == 'folders' ?
+                        fileRef.relationships.parent.data.id : null
                 });
             }
         },
@@ -221,5 +228,12 @@ export default {
             });
         },
     },
+    watch: {
+        currentFile(value) {
+            if (value?.folder_id) {
+                this.validateFolderAccessibility(value.folder_id);
+            }
+        }
+    },
 };
 </script>
diff --git a/resources/vue/components/courseware/CoursewareFolderBlock.vue b/resources/vue/components/courseware/CoursewareFolderBlock.vue
index a1b97490d09da6b5c9e9cbed9df1e5e03fac1c21..bcf6ccc56679f88cdd15f9b2496ccbc8107fd0cc 100755
--- a/resources/vue/components/courseware/CoursewareFolderBlock.vue
+++ b/resources/vue/components/courseware/CoursewareFolderBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="currentTitle !== ''" class="cw-block-title">{{ currentTitle }}</div>
                 <ul class="cw-block-folder-list">
                     <li v-for="file in files" :key="file.id" class="cw-block-folder-file-item">
@@ -48,11 +51,13 @@
 <script>
 import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFolderChooser from './CoursewareFolderChooser.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-folder-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFolderChooser,
@@ -186,7 +191,8 @@ export default {
         },
     },
     watch: {
-        currentFolderId() {
+        currentFolderId(value) {
+            this.validateFolderAccessibility(value);
             this.getFolderFiles();
         },
     },
diff --git a/resources/vue/components/courseware/CoursewareFolderChooser.vue b/resources/vue/components/courseware/CoursewareFolderChooser.vue
index 95df18b8f59a3928c5dfddb10345fb2cf911c630..30abf1c576dcabec134b606a35f6a533f1c674e7 100755
--- a/resources/vue/components/courseware/CoursewareFolderChooser.vue
+++ b/resources/vue/components/courseware/CoursewareFolderChooser.vue
@@ -48,21 +48,23 @@ export default {
             let loadedCourseFolders = [];
             let CourseFolders = this.relatedFolders({ parent: this.courseObject, relationship: 'folders' }) ?? [];
             CourseFolders.forEach(folder => {
-                switch (folder.attributes['folder-type']) {
-                    case 'HiddenFolder':
-                        if (folder.attributes['data-content']['download_allowed'] === 1) {
+                if (this.validateParentFolder(folder)) {
+                    switch (folder.attributes['folder-type']) {
+                        case 'HiddenFolder':
+                            if (folder.attributes['data-content']['download_allowed'] === 1) {
+                                loadedCourseFolders.push(folder);
+                            }
+                            break;
+                        case 'HomeworkFolder':
+                            if(this.allowHomeworkFolders) {
+                                loadedCourseFolders.push(folder);
+                            }
+                            break;
+                        default:
                             loadedCourseFolders.push(folder);
-                        }
-                        break;
-                    case 'HomeworkFolder':
-                        if(this.allowHomeworkFolders) {
-                            loadedCourseFolders.push(folder);
-                        }
-                    default:
-                        loadedCourseFolders.push(folder);
+                    }
                 }
             });
-
             return loadedCourseFolders;
         },
         loadedUserFolders() {
@@ -79,7 +81,7 @@ export default {
     },
     methods: {
         ...mapActions({
-            loadRelatedFolders: 'folders/loadRelated' 
+            loadRelatedFolders: 'folders/loadRelated'
         }),
 
         changeSelection() {
@@ -101,6 +103,30 @@ export default {
 
             return this.loadRelatedFolders({ parent, relationship, options });
         },
+
+        validateParentFolder(folder) {
+            let courseFolders = this.relatedFolders({ parent: this.courseObject, relationship: 'folders' }) ?? [];
+            var validation = true;
+            if (courseFolders.length > 0 && folder && folder.relationships && folder.relationships.parent) {
+                var parentId = folder.relationships.parent.data.id;
+                var parent = courseFolders.find(f => f.id == parentId);
+                if (parent) {
+                    validation = this.hiddenParentFolderValidation(parent);
+                }
+            }
+            return validation;
+        },
+
+        hiddenParentFolderValidation(parentFolder) {
+            if (parentFolder.attributes['folder-type'] == 'HiddenFolder') {
+                return false;
+            } else if (parentFolder.relationships && parentFolder.relationships.parent) {
+                // Recursively validating the parents.
+                return this.validateParentFolder(parentFolder);
+            } else {
+                return true;
+            }
+        }
     },
     mounted() {
         this.currentValue = this.value;
diff --git a/resources/vue/components/courseware/CoursewareGalleryBlock.vue b/resources/vue/components/courseware/CoursewareGalleryBlock.vue
index 9d0549b25c9f887f3c44de70246d0491b333e82c..cca5b2677807d1eeea1c563073dff2cb92fcad3a 100755
--- a/resources/vue/components/courseware/CoursewareGalleryBlock.vue
+++ b/resources/vue/components/courseware/CoursewareGalleryBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="files.length !== 0" class="cw-block-gallery-content" :style="{ 'max-height': currentHeight + 'px' }">
                     <div
                         v-for="(image, index) in files"
@@ -83,11 +86,13 @@
 <script>
 import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFolderChooser from './CoursewareFolderChooser.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-gallery-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFolderChooser,
@@ -241,7 +246,8 @@ export default {
         },
     },
     watch: {
-        currentFolderId() {
+        currentFolderId(value) {
+            this.validateFolderAccessibility(value);
             this.getFolderFiles();
         },
         currentAutoplay(value) {
diff --git a/resources/vue/components/courseware/CoursewareHeadlineBlock.vue b/resources/vue/components/courseware/CoursewareHeadlineBlock.vue
index 349ac9545c262ff6147f5ba5e9dd906d9ed1431e..d49bb267962d11514f496ddb5fb272471cb7dce4 100755
--- a/resources/vue/components/courseware/CoursewareHeadlineBlock.vue
+++ b/resources/vue/components/courseware/CoursewareHeadlineBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="closeEdit"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div
                     class="cw-block-headline-content"
                     :class="[currentStyle, currentHeight === 'half' ? 'half' : 'full']"
@@ -171,9 +174,11 @@ import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import { mapGetters, mapActions } from 'vuex';
 import contentIcons from './content-icons.js';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 export default {
     name: 'courseware-headline-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -337,6 +342,8 @@ export default {
                         { type: 0, file_id: fileRef.id, file_name: fileRef.attributes.name },
                         true
                     ),
+                    folder_id: fileRef?.relationships?.parent && fileRef.relationships.parent.data.type == 'folders' ?
+                        fileRef.relationships.parent.data.id : null
                 });
             }
         },
@@ -410,5 +417,12 @@ export default {
             return hex.length === 1 ? '0' + hex : hex;
         },
     },
+    watch: {
+        currentBackgroundImage(value) {
+            if (value?.folder_id) {
+                this.validateFolderAccessibility(value.folder_id);
+            }
+        }
+    },
 };
 </script>
diff --git a/resources/vue/components/courseware/CoursewareImageMapBlock.vue b/resources/vue/components/courseware/CoursewareImageMapBlock.vue
index 082e2ac9ef33d68ef61bb848c6f6bb76f3d5636e..0a0cb3341fa1168cc3805005d88036f27f4f2d86 100755
--- a/resources/vue/components/courseware/CoursewareImageMapBlock.vue
+++ b/resources/vue/components/courseware/CoursewareImageMapBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <img :src="currentUrl" class="cw-image-map-original-img" ref="original_img" @load="buildCanvas" />
                 <canvas class="cw-image-map-canvas" ref="canvas"></canvas>
                 <img
@@ -160,11 +163,13 @@ import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
 import CoursewareTabs from './CoursewareTabs.vue';
 import CoursewareTab from './CoursewareTab.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-image-map-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -250,6 +255,8 @@ export default {
                         { type: 0, file_id: fileRef.id, file_name: fileRef.attributes.name },
                         true
                     ),
+                    folder_id: fileRef?.relationships?.parent && fileRef.relationships.parent.data.type == 'folders' ?
+                        fileRef.relationships.parent.data.id : null
                 });
             }
         },
@@ -376,7 +383,7 @@ export default {
             shapeWidth = shapeWidth || 0;
 
             let newText = [];
-            
+
             if (shapeWidth <= 0) {
                 return [text];
             }
@@ -519,5 +526,12 @@ export default {
             this.currentShapes[index].target_external = url;
         },
     },
+    watch: {
+        currentFile(value) {
+            if (value?.folder_id) {
+                this.validateFolderAccessibility(value.folder_id);
+            }
+        }
+    },
 };
 </script>
diff --git a/resources/vue/components/courseware/CoursewareVideoBlock.vue b/resources/vue/components/courseware/CoursewareVideoBlock.vue
index 71f5f77af57792865b676c31a8be691449c7b853..38b9b029ffd6799ccf640cbfbd6e2a28208da380 100755
--- a/resources/vue/components/courseware/CoursewareVideoBlock.vue
+++ b/resources/vue/components/courseware/CoursewareVideoBlock.vue
@@ -9,6 +9,9 @@
             @closeEdit="initCurrentData"
         >
             <template #content>
+                <div v-if="showInvalidFolderMessage" class="messagebox messagebox_error">
+                    {{ invalidFolderMessageText }}
+                </div>
                 <div v-if="currentTitle !== '' && currentURL" class="cw-block-title">{{ currentTitle }}</div>
                 <video
                     v-show="currentURL"
@@ -75,10 +78,12 @@
 <script>
 import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
 import CoursewareFileChooser from './CoursewareFileChooser.vue';
+import { blockFolderValidatorMixin } from './block-folder-validator-mixin.js';
 import { mapActions, mapGetters } from 'vuex';
 
 export default {
     name: 'courseware-video-block',
+    mixins: [blockFolderValidatorMixin],
     components: {
         CoursewareDefaultBlock,
         CoursewareFileChooser,
@@ -202,6 +207,8 @@ export default {
                         { type: 0, file_id: fileRef.id, file_name: fileRef.attributes.name },
                         true
                     ),
+                    folder_id: fileRef?.relationships?.parent && fileRef.relationships.parent.data.type == 'folders' ?
+                        fileRef.relationships.parent.data.id : null
                 });
             }
         },
@@ -215,5 +222,12 @@ export default {
             }
         },
     },
+    watch: {
+        currentFile(value) {
+            if (value?.folder_id) {
+                this.validateFolderAccessibility(value.folder_id);
+            }
+        }
+    },
 };
 </script>
diff --git a/resources/vue/components/courseware/block-folder-validator-mixin.js b/resources/vue/components/courseware/block-folder-validator-mixin.js
new file mode 100644
index 0000000000000000000000000000000000000000..6650709943a4cdcc19686b766d4f4888a768d382
--- /dev/null
+++ b/resources/vue/components/courseware/block-folder-validator-mixin.js
@@ -0,0 +1,47 @@
+import { mapActions, mapGetters } from 'vuex';
+
+export const blockFolderValidatorMixin = {
+    computed: {
+        ...mapGetters({
+            folderById: 'folders/byId',
+        }),
+        invalidFolderMessageText() {
+            return this.$gettext('Der Zugriff auf ausgewählte Datei(en) könnte gesperrt sein!')
+        }
+    },
+    data() {
+        return {
+            showInvalidFolderMessage: false
+        }
+    },
+    methods: {
+        ...mapActions({
+            loadFolder: 'folders/loadById',
+        }),
+        async validateFolderAccessibility(folderId) {
+            var valid = false;
+            if (folderId) {
+                try {
+                    var id = folderId;
+                    await this.loadFolder({ id });
+                    var folder = this.folderById({ id });
+                    if (folder && folder.relationships && folder.relationships.parent) {
+                        var id = folder.relationships.parent.data.id;
+                        await this.loadFolder({ id });
+                        var parent = this.folderById({ id });
+                        if (parent && parent.attributes['folder-type'] == 'HiddenFolder') {
+                            valid = false;
+                        } else if (parent.relationships && parent.relationships.parent) {
+                            this.validateFolderAccessibility(parent.id);
+                        } else {
+                            valid = true;
+                        }
+                    }
+                } catch (err) {
+                    valid = false;
+                }
+            }
+            this.showInvalidFolderMessage = this.isTeacher ? !valid : false;
+        },
+    },
+};