├── .babelrc
├── .dockerignore
├── .editorconfig
├── .env.ci
├── .env.example
├── .gitattributes
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── dependabot.yml
├── pull_request_template.md
└── workflows
│ ├── ci-docker.yml
│ ├── ci.yml
│ ├── deploy-docs.yml
│ ├── pull-locales.yml
│ ├── update-bbb-recording-player.yml
│ └── upload-locales.yml
├── .gitignore
├── .npmrc
├── .nvmrc
├── .nycrc.json
├── .opencode
└── screenshots
│ ├── de
│ ├── app_settings.jpg
│ ├── dashboard.jpg
│ ├── home.jpg
│ ├── login.jpg
│ ├── profile_base.jpg
│ ├── profile_security.jpg
│ ├── roles.jpg
│ ├── roles_detail.jpg
│ ├── room_attendance.jpg
│ ├── room_description.jpg
│ ├── room_files.jpg
│ ├── room_history.jpg
│ ├── room_members.jpg
│ ├── room_personalized_room_links.jpg
│ ├── room_settings.jpg
│ ├── room_stats.jpg
│ ├── room_types.jpg
│ ├── room_types_edit.jpg
│ ├── room_types_edit_settings.jpg
│ ├── running_meetings.jpg
│ ├── server_pools.jpg
│ ├── servers.jpg
│ ├── servers_edit.jpg
│ ├── settings.jpg
│ └── users.jpg
│ └── en
│ ├── app_settings.jpg
│ ├── dashboard.jpg
│ ├── home.jpg
│ ├── login.jpg
│ ├── profile_base.jpg
│ ├── profile_security.jpg
│ ├── roles.jpg
│ ├── roles_detail.jpg
│ ├── room_attendance.jpg
│ ├── room_description.jpg
│ ├── room_files.jpg
│ ├── room_history.jpg
│ ├── room_members.jpg
│ ├── room_personalized_room_links.jpg
│ ├── room_settings.jpg
│ ├── room_stats.jpg
│ ├── room_types.jpg
│ ├── room_types_edit.jpg
│ ├── room_types_edit_settings.jpg
│ ├── running_meetings.jpg
│ ├── server_pools.jpg
│ ├── servers.jpg
│ ├── servers_edit.jpg
│ ├── settings.jpg
│ └── users.jpg
├── .prettierignore
├── .prettierrc
├── .styleci.yml
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── SECURITY.md
├── _ide_helper.php
├── app
├── Auth
│ ├── ExternalUser.php
│ ├── LDAP
│ │ ├── LDAPController.php
│ │ ├── LDAPProvider.php
│ │ ├── LDAPServiceProvider.php
│ │ ├── LDAPUser.php
│ │ └── LDAPUserObject.php
│ ├── Local
│ │ └── LocalProvider.php
│ ├── MissingAttributeException.php
│ ├── Shibboleth
│ │ ├── LogoutNotification.wsdl
│ │ ├── ShibbolethController.php
│ │ ├── ShibbolethProvider.php
│ │ ├── ShibbolethServiceProvider.php
│ │ ├── ShibbolethSessionDuplicateException.php
│ │ ├── ShibbolethSessionMiddleware.php
│ │ ├── ShibbolethUser.php
│ │ └── SoapServerHandler.php
│ └── config
│ │ └── .gitignore
├── Console
│ ├── Commands
│ │ ├── CacheLocalesCommand.php
│ │ ├── CheckDatabaseConnectionCommand.php
│ │ ├── CleanupAttendanceCommand.php
│ │ ├── CleanupRecordingsCommand.php
│ │ ├── CleanupRoomsCommand.php
│ │ ├── CleanupStatisticsCommand.php
│ │ ├── CreateSuperuserCommand.php
│ │ ├── DeleteObsoleteTokensCommand.php
│ │ ├── DeleteUnverifiedNewUsersCommand.php
│ │ ├── ExportLocalesCommand.php
│ │ ├── ImportDatabaseCommand.php
│ │ ├── ImportGreenlight2Command.php
│ │ ├── ImportLocalesCommand.php
│ │ ├── ImportRecordingsCommand.php
│ │ ├── PollServerCommand.php
│ │ ├── ProvisionCommand.php
│ │ ├── TestEmailConfig.php
│ │ ├── UpgradeDatabaseCommand.php
│ │ └── UploadLocalesCommand.php
│ └── Kernel.php
├── Enums
│ ├── CustomStatusCodes.php
│ ├── LinkButtonStyle.php
│ ├── LinkTarget.php
│ ├── RecordingAccess.php
│ ├── RoomLobby.php
│ ├── RoomSortingType.php
│ ├── RoomUserRole.php
│ ├── RoomVisibility.php
│ ├── ServerHealth.php
│ ├── ServerStatus.php
│ └── TimePeriod.php
├── Events
│ ├── RoomEnded.php
│ └── RoomStarted.php
├── Exceptions
│ ├── Handler.php
│ ├── RecordingExtractionFailed.php
│ └── RoomIdGenerationFailed.php
├── Exports
│ └── AttendanceExport.php
├── Faker
│ └── TextProvider.php
├── Http
│ ├── Controllers
│ │ ├── ApplicationController.php
│ │ ├── Controller.php
│ │ ├── FileController.php
│ │ ├── MeetingController.php
│ │ ├── RecordingController.php
│ │ └── api
│ │ │ └── v1
│ │ │ ├── ApplicationController.php
│ │ │ ├── LocaleController.php
│ │ │ ├── MeetingController.php
│ │ │ ├── PermissionController.php
│ │ │ ├── RecordingController.php
│ │ │ ├── RecordingFormatController.php
│ │ │ ├── RoleController.php
│ │ │ ├── RoomController.php
│ │ │ ├── RoomFileController.php
│ │ │ ├── RoomMemberController.php
│ │ │ ├── RoomStreamingController.php
│ │ │ ├── RoomTokenController.php
│ │ │ ├── RoomTypeController.php
│ │ │ ├── RoomTypeStreamingController.php
│ │ │ ├── ServerController.php
│ │ │ ├── ServerPoolController.php
│ │ │ ├── SessionController.php
│ │ │ ├── SettingsController.php
│ │ │ ├── StreamingController.php
│ │ │ ├── UserController.php
│ │ │ └── auth
│ │ │ ├── ForgotPasswordController.php
│ │ │ ├── LoginController.php
│ │ │ ├── RegisterController.php
│ │ │ ├── ResetPasswordController.php
│ │ │ └── VerificationController.php
│ ├── Kernel.php
│ ├── Middleware
│ │ ├── Authenticate.php
│ │ ├── EncryptCookies.php
│ │ ├── EnsureModelNotStale.php
│ │ ├── LogContext.php
│ │ ├── LoggedInUser.php
│ │ ├── PreventRequestsDuringMaintenance.php
│ │ ├── RedirectIfAuthenticated.php
│ │ ├── RoomAuthenticate.php
│ │ ├── RouteEnableIfConfig.php
│ │ ├── SetApplicationLocale.php
│ │ ├── StoreSessionData.php
│ │ ├── TrimStrings.php
│ │ ├── TrustHosts.php
│ │ ├── TrustProxies.php
│ │ └── VerifyCsrfToken.php
│ ├── Requests
│ │ ├── AddRoomMember.php
│ │ ├── BulkDestroyRequest.php
│ │ ├── BulkImportRequest.php
│ │ ├── BulkUpdateRequest.php
│ │ ├── ChangeEmailRequest.php
│ │ ├── ChangeLocaleRequest.php
│ │ ├── ChangePasswordRequest.php
│ │ ├── CreateRoom.php
│ │ ├── JoinMeeting.php
│ │ ├── NewUserRequest.php
│ │ ├── RoleRequest.php
│ │ ├── RoomTokenRequest.php
│ │ ├── RoomTypeDestroyRequest.php
│ │ ├── RoomTypeRequest.php
│ │ ├── ServerConnectionCheckRequest.php
│ │ ├── ServerPoolRequest.php
│ │ ├── ServerRequest.php
│ │ ├── ShowRoomsRequest.php
│ │ ├── StartMeeting.php
│ │ ├── StoreRoomFile.php
│ │ ├── TransferOwnershipRequest.php
│ │ ├── UpdateRecordingRequest.php
│ │ ├── UpdateRoomDescription.php
│ │ ├── UpdateRoomFile.php
│ │ ├── UpdateRoomMember.php
│ │ ├── UpdateRoomSettings.php
│ │ ├── UpdateRoomStreamingConfig.php
│ │ ├── UpdateRoomTypeStreamingSettings.php
│ │ ├── UpdateSettings.php
│ │ ├── UpdateStreamingSettings.php
│ │ ├── UserRequest.php
│ │ └── VerifyEmailRequest.php
│ └── Resources
│ │ ├── Attendee.php
│ │ ├── AttendeeSession.php
│ │ ├── Config.php
│ │ ├── LastMeeting.php
│ │ ├── Meeting.php
│ │ ├── MeetingStat.php
│ │ ├── MeetingWithRoomAndServer.php
│ │ ├── Permission.php
│ │ ├── PermissionResourceCollection.php
│ │ ├── PrivateRoomFile.php
│ │ ├── RecordingFormatResource.php
│ │ ├── RecordingResource.php
│ │ ├── Role.php
│ │ ├── RoleCollection.php
│ │ ├── Room.php
│ │ ├── RoomFile.php
│ │ ├── RoomSettings.php
│ │ ├── RoomStreaming.php
│ │ ├── RoomStreamingConfig.php
│ │ ├── RoomToken.php
│ │ ├── RoomType.php
│ │ ├── RoomTypeResourceCollection.php
│ │ ├── RoomTypeStreamingSettings.php
│ │ ├── RoomUser.php
│ │ ├── Server.php
│ │ ├── ServerPool.php
│ │ ├── SessionResource.php
│ │ ├── Settings.php
│ │ ├── StreamingSettings.php
│ │ ├── User.php
│ │ └── UserSearch.php
├── Jobs
│ ├── PollServerJob.php
│ └── ProcessRecording.php
├── Listeners
│ ├── ConfigureStreamingOnRoomStart.php
│ ├── FailedLoginAttempt.php
│ └── ResetStreamingOnRoomStop.php
├── Models
│ ├── IncludedPermissionPermission.php
│ ├── Meeting.php
│ ├── MeetingAttendee.php
│ ├── MeetingStat.php
│ ├── Permission.php
│ ├── PermissionRole.php
│ ├── Recording.php
│ ├── RecordingFormat.php
│ ├── Role.php
│ ├── RoleUser.php
│ ├── Room.php
│ ├── RoomFile.php
│ ├── RoomStreaming.php
│ ├── RoomToken.php
│ ├── RoomType.php
│ ├── RoomTypeStreamingSettings.php
│ ├── RoomUser.php
│ ├── Server.php
│ ├── ServerPool.php
│ ├── ServerStat.php
│ ├── Session.php
│ ├── SessionData.php
│ ├── User.php
│ └── VerifyEmail.php
├── Notifications
│ ├── EmailChanged.php
│ ├── PasswordChanged.php
│ ├── PasswordReset.php
│ ├── RoomExpires.php
│ ├── TestEmail.php
│ ├── UserWelcome.php
│ └── VerifyEmail.php
├── Plugins
│ ├── Contracts
│ │ └── ServerLoadCalculationPluginContract.php
│ ├── Custom
│ │ └── .gitignore
│ ├── Defaults
│ │ └── ServerLoadCalculationPlugin.php
│ └── PluginServiceProvider.php
├── Policies
│ ├── MeetingPolicy.php
│ ├── RolePolicy.php
│ ├── RoomPolicy.php
│ ├── RoomTypePolicy.php
│ ├── ServerPolicy.php
│ ├── ServerPoolPolicy.php
│ └── UserPolicy.php
├── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ ├── FakerServiceProvider.php
│ ├── HorizonServiceProvider.php
│ ├── RouteServiceProvider.php
│ ├── TelescopeServiceProvider.php
│ └── TranslationServiceProvider.php
├── Pulse
│ └── Users.php
├── Rules
│ ├── CustomCreateMeetingParameters.php
│ ├── CustomJoinMeetingParameters.php
│ ├── Password.php
│ ├── ValidName.php
│ └── ValidRoomType.php
├── Services
│ ├── AuthenticationService.php
│ ├── BigBlueButton
│ │ └── LaravelHTTPClient.php
│ ├── EmailVerification
│ │ ├── EmailVerificationService.php
│ │ └── NewVerifyEmailToken.php
│ ├── LoadBalancingService.php
│ ├── LocaleService.php
│ ├── MeetingService.php
│ ├── ProvisioningService.php
│ ├── RoomAuthService.php
│ ├── RoomFileService.php
│ ├── RoomService.php
│ ├── ServerService.php
│ ├── StreamingService.php
│ └── StreamingServiceFactory.php
├── Settings
│ ├── BannerSettings.php
│ ├── BigBlueButtonSettings.php
│ ├── GeneralSettings.php
│ ├── RecordingSettings.php
│ ├── RoomSettings.php
│ ├── StreamingSettings.php
│ ├── ThemeSettings.php
│ └── UserSettings.php
├── Support
│ ├── CSPPolicy.php
│ └── LaravelViteNonceGenerator.php
└── Traits
│ └── AddsModelNameTrait.php
├── artisan
├── bigbluebutton
├── pilos.yml
└── pilos_post_publish.rb
├── bootstrap
├── app.php
└── cache
│ └── .gitignore
├── compose.test.ci.yml
├── compose.test.local.yml
├── compose.test.yml
├── composer.json
├── composer.lock
├── config
├── app.php
├── auth.php
├── bigbluebutton.php
├── broadcasting.php
├── cache.php
├── cors.php
├── csp.php
├── database.php
├── excel.php
├── filesystems.php
├── greenlight.php
├── hashing.php
├── horizon.php
├── ldap.php
├── logging.php
├── mail.php
├── permissions.php
├── plugins.php
├── pulse.php
├── queue.php
├── recording.php
├── sanctum.php
├── services.php
├── session.php
├── settings.php
├── streaming.php
├── telescope.php
└── view.php
├── cypress.config.js
├── database
├── .gitignore
├── factories
│ ├── .gitkeep
│ ├── MeetingFactory.php
│ ├── PermissionFactory.php
│ ├── RecordingFactory.php
│ ├── RecordingFormatFactory.php
│ ├── RoleFactory.php
│ ├── RoomFactory.php
│ ├── RoomFileFactory.php
│ ├── RoomTokenFactory.php
│ ├── RoomTypeFactory.php
│ ├── ServerFactory.php
│ ├── ServerPoolFactory.php
│ └── UserFactory.php
├── migrations
│ ├── 2014_10_12_000000_create_users_table.php
│ ├── 2014_10_12_100000_create_password_resets_table.php
│ ├── 2018_08_08_100000_create_telescope_entries_table.php
│ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│ ├── 2022_07_21_000001_create_roles_table.php
│ ├── 2022_07_21_000002_create_role_user_table.php
│ ├── 2022_07_21_000003_create_permissions_table.php
│ ├── 2022_07_21_000004_create_permissions_role_table.php
│ ├── 2022_07_21_000005_create_included_permissions_table.php
│ ├── 2022_07_21_000007_create_servers_table.php
│ ├── 2022_07_21_000008_create_server_pools_table.php
│ ├── 2022_07_21_000009_create_server_server_pool_table.php
│ ├── 2022_07_21_000010_create_room_types_table.php
│ ├── 2022_07_21_000011_create_role_room_type_table.php
│ ├── 2022_07_21_000012_create_rooms_table.php
│ ├── 2022_07_21_000013_create_room_users_table.php
│ ├── 2022_07_21_000014_create_room_files_table.php
│ ├── 2022_07_21_000015_create_room_tokens_table.php
│ ├── 2022_07_21_000016_create_meetings_table.php
│ ├── 2022_07_21_000017_create_meeting_attendees_table.php
│ ├── 2022_07_21_000018_create_meeting_stats_table.php
│ ├── 2022_07_21_000019_create_server_stats_table.php
│ ├── 2022_09_27_193354_create_sessions_table.php
│ ├── 2022_09_29_101046_create_verify_emails_table.php
│ ├── 2023_04_13_151058_create_session_data_table.php
│ ├── 2023_04_14_083707_create_settings_table.php
│ ├── 2023_06_07_000001_create_pulse_tables.php
│ ├── 2023_08_02_085644_add_meeting_id_to_rooms.php
│ ├── 2023_08_03_070204_create_room_favorites_table.php
│ ├── 2024_04_25_095728_create_recordings_table.php
│ ├── 2024_04_25_141742_create_recording_formats_table.php
│ ├── 2024_05_22_101114_add_create_parameters_to_room_types_table.php
│ ├── 2024_11_06_171039_create_room_streamings_table.php
│ ├── 2024_11_26_131851_create_room_type_streaming_settings_table.php
│ ├── 2024_12_19_103013_make_server_name_unique.php
│ ├── 2025_03_31_130245_add_external_image_hash_to_users_table.php
│ ├── 2025_05_20_092623_add_last_login_to_users_table.php
│ ├── 2025_05_20_153825_add_join_parameters_to_room_types_table.php
│ ├── migrate-to-v4
│ │ ├── 2022_12_14_083707_refactor_settings_table.php
│ │ ├── 2023_07_31_143604_add_short_description_to_rooms_table.php
│ │ ├── 2023_11_24_135054_remove_short_from_room_types.php
│ │ ├── 2024_01_30_194814_move_duration_and_participants_to_room_types_table.php
│ │ ├── 2024_01_31_070902_add_require_access_code_to_room_types_table.php
│ │ ├── 2024_01_31_071243_add_allow_record_attendace_to_room_types_table.php
│ │ ├── 2024_02_15_084719_remove_password_in_meetings_table.php
│ │ ├── 2024_02_28_140151_rename_description_in_room_types_table.php
│ │ ├── 2024_02_29_091745_rename_columns_in_roles_table.php
│ │ ├── 2024_03_06_152142_add_health_counters_to_servers_table.php
│ │ ├── 2024_03_07_085720_add_disconnected_to_meetings_table.php
│ │ ├── 2024_03_10_095259_add_description_to_room_types_table.php
│ │ ├── 2024_03_10_102618_add_default_settings_for_rooms_to_room_types_table.php
│ │ ├── 2024_03_13_183840_add_expert_mode_to_rooms_table.php
│ │ ├── 2024_03_26_165418_add_load_to_servers_table.php
│ │ ├── 2024_04_02_134419_rename_allow_record_attendance_in_room_types_table.php
│ │ ├── 2024_04_02_141431_rename_allow_listing_in_room_types_table.php
│ │ ├── 2024_04_05_084006_rename_listed_in_rooms_table.php
│ │ ├── 2024_04_05_092032_rename_require_access_code_in_room_types_table.php
│ │ ├── 2024_04_25_064823_add_record_to_rooms.php
│ │ ├── 2024_04_25_064827_add_record_to_meetings.php
│ │ ├── 2024_04_25_084656_add_allow_record_to_room_types_table.php
│ │ └── 2024_04_25_094656_refactor_sessions_table.php
│ └── v2
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ ├── 2018_08_08_100000_create_telescope_entries_table.php
│ │ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│ │ ├── 2022_07_21_000001_create_roles_table.php
│ │ ├── 2022_07_21_000002_create_role_user_table.php
│ │ ├── 2022_07_21_000003_create_permissions_table.php
│ │ ├── 2022_07_21_000004_create_permissions_role_table.php
│ │ ├── 2022_07_21_000005_create_included_permissions_table.php
│ │ ├── 2022_07_21_000006_create_settings_table.php
│ │ ├── 2022_07_21_000007_create_servers_table.php
│ │ ├── 2022_07_21_000008_create_server_pools_table.php
│ │ ├── 2022_07_21_000009_create_server_server_pool_table.php
│ │ ├── 2022_07_21_000010_create_room_types_table.php
│ │ ├── 2022_07_21_000011_create_role_room_type_table.php
│ │ ├── 2022_07_21_000012_create_rooms_table.php
│ │ ├── 2022_07_21_000013_create_room_users_table.php
│ │ ├── 2022_07_21_000014_create_room_files_table.php
│ │ ├── 2022_07_21_000015_create_room_tokens_table.php
│ │ ├── 2022_07_21_000016_create_meetings_table.php
│ │ ├── 2022_07_21_000017_create_meeting_attendees_table.php
│ │ ├── 2022_07_21_000018_create_meeting_stats_table.php
│ │ ├── 2022_07_21_000019_create_server_stats_table.php
│ │ ├── 2022_09_23_144227_add_description_to_rooms_table.php
│ │ ├── 2022_09_27_193354_create_sessions_table.php
│ │ ├── 2022_09_29_101046_create_verify_emails_table.php
│ │ ├── 2023_04_04_090145_rename_username_field.php
│ │ ├── 2023_04_13_151058_create_session_data_table.php
│ │ ├── 2023_08_29_111743_rename_password_self_reset_enabled_setting.php
│ │ ├── 2023_09_01_100006_revert_authenticator_bundling.php
│ │ └── 2023_09_28_084531_rename_salt_to_secret_in_servers_table.php
├── seeders
│ ├── DatabaseSeeder.php
│ ├── Demo
│ │ ├── CreateDemoSystem.php
│ │ └── storage
│ │ │ ├── abc-def-123
│ │ │ ├── anatomy-foot.pdf
│ │ │ └── anatomy-introduction.pdf
│ │ │ └── public
│ │ │ └── profile_images
│ │ │ ├── angela-jones.jpg
│ │ │ ├── daniel-osorio.jpg
│ │ │ └── john-doe.jpg
│ ├── RolesAndPermissionsSeeder.php
│ ├── RoomTypeSeeder.php
│ ├── ServerPoolSeeder.php
│ └── ServerSeeder.php
└── settings
│ ├── 2023_04_14_095406_create_general_settings.php
│ ├── 2023_04_14_101741_create_banner_settings.php
│ ├── 2023_04_14_102134_create_room_settings.php
│ ├── 2023_04_14_103520_create_user_settings.php
│ ├── 2023_04_14_103845_create_recording_settings.php
│ ├── 2023_04_14_103858_create_big_blue_button_settings.php
│ ├── 2024_05_24_135649_add_toast_life_time_to_general_settings.php
│ ├── 2024_07_09_122330_add_theme_settings.php
│ ├── 2024_07_10_090412_move_logo_to_theme_settings.php
│ ├── 2024_09_27_065358_add_file_terms_of_use_to_room_settings.php
│ ├── 2024_09_27_101218_add_no_welcome_page_to_general_settings.php
│ ├── 2024_11_26_131704_create_streaming_settings.php
│ ├── 2024_12_13_133315_add_dark_mode_logo_to_big_blue_button_settings.php
│ └── 2025_01_09_135151_fix_invalid_link_button_style.php
├── docker-compose-dev.yml
├── docker-compose.yml
├── docker
├── app
│ ├── Dockerfile
│ ├── cron
│ │ └── scheduler
│ ├── entrypoint
│ ├── ldap
│ │ └── ldap.conf
│ ├── nginx
│ │ ├── sites-enabled
│ │ │ └── default
│ │ ├── snippets-available
│ │ │ └── ssl
│ │ └── templates
│ │ │ └── nginx.template
│ ├── php
│ │ ├── opcache.ini
│ │ ├── php.ini
│ │ └── zz-docker.conf
│ ├── pilos-cli
│ ├── playback-player
│ │ └── build.sh
│ └── supervisord
│ │ └── supervisord.conf
└── openldap
│ ├── acl.ldif
│ └── bootstrap.ldif
├── docs
├── .gitignore
├── README.md
├── build.sh
├── docs
│ ├── administration
│ │ ├── 01-intro.md
│ │ ├── 02-getting-started.md
│ │ ├── 03-configuration.md
│ │ ├── 04-pilos-cli.md
│ │ ├── 05-upgrade.md
│ │ ├── 06-greenlight.md
│ │ ├── 07-backup.md
│ │ ├── 08-advanced
│ │ │ ├── 01-external-authentication.md
│ │ │ ├── 02-roles-and-permissions.md
│ │ │ ├── 03-recording.md
│ │ │ ├── 04-streaming.md
│ │ │ ├── 05-scaling.md
│ │ │ ├── 06-migrate-greenlight.md
│ │ │ ├── 07-provisioning.md
│ │ │ └── _category_.json
│ │ ├── 09-customisation
│ │ │ ├── 01-default-setting.md
│ │ │ ├── 02-locales.md
│ │ │ ├── 03-components.md
│ │ │ ├── 04-docker-image.md
│ │ │ └── index.md
│ │ └── 10-plugins
│ │ │ ├── ServerLoadCalculationPlugin.md
│ │ │ └── index.md
│ └── development
│ │ ├── 01-intro.md
│ │ ├── 02-getting-started.md
│ │ ├── 03-configuration.md
│ │ ├── 04-workflow.md
│ │ ├── 05-code-style.md
│ │ ├── 06-documentation.md
│ │ └── 07-testing.md
├── docusaurus.config.js
├── package-lock.json
├── package.json
├── sidebars.js
├── src
│ ├── components
│ │ └── HomepageFeatures
│ │ │ ├── index.js
│ │ │ └── styles.module.css
│ ├── css
│ │ └── custom.css
│ └── pages
│ │ ├── index.js
│ │ ├── index.module.css
│ │ └── markdown-page.md
└── static
│ ├── .nojekyll
│ └── img
│ ├── favicon.ico
│ ├── laptop-code-solid.svg
│ ├── logo-dark.svg
│ ├── logo.svg
│ ├── social-card.png
│ └── toolbox-solid.svg
├── eslint.config.js
├── lang
├── de-gender
│ ├── admin.php
│ ├── app.php
│ ├── auth.php
│ ├── mail.php
│ ├── meetings.php
│ ├── pagination.php
│ ├── passwords.php
│ ├── rooms.php
│ ├── system.php
│ └── validation.php
├── de
│ ├── admin.php
│ ├── app.php
│ ├── auth.php
│ ├── home.php
│ ├── mail.php
│ ├── meetings.php
│ ├── metadata.json
│ ├── pagination.php
│ ├── passwords.php
│ ├── rooms.php
│ ├── system.php
│ └── validation.php
├── en
│ ├── admin.php
│ ├── app.php
│ ├── auth.php
│ ├── home.php
│ ├── mail.php
│ ├── meetings.php
│ ├── metadata.json
│ ├── pagination.php
│ ├── passwords.php
│ ├── rooms.php
│ ├── system.php
│ └── validation.php
├── fa
│ ├── admin.php
│ ├── app.php
│ ├── auth.php
│ ├── home.php
│ ├── mail.php
│ ├── meetings.php
│ ├── metadata.json
│ ├── pagination.php
│ ├── passwords.php
│ ├── rooms.php
│ ├── system.php
│ └── validation.php
└── fr
│ ├── admin.php
│ ├── app.php
│ ├── auth.php
│ ├── home.php
│ ├── mail.php
│ ├── meetings.php
│ ├── metadata.json
│ ├── pagination.php
│ ├── passwords.php
│ ├── rooms.php
│ ├── system.php
│ └── validation.php
├── logo.svg
├── package-lock.json
├── package.json
├── phpunit.xml
├── pint.json
├── postcss.config.js
├── public
├── .htaccess
├── images
│ ├── custom
│ │ └── .gitignore
│ ├── default_profile.png
│ ├── favicon-dark.ico
│ ├── favicon.ico
│ ├── hero
│ │ ├── hero1.jpg
│ │ ├── hero2.jpg
│ │ ├── hero3.jpg
│ │ ├── hero4.jpg
│ │ └── hero5.jpg
│ ├── livestream_avatar.png
│ ├── logo-dark.svg
│ └── logo.svg
├── index.php
├── robots.txt
└── vendor
│ ├── horizon
│ ├── app-dark.css
│ ├── app.css
│ ├── app.js
│ ├── favicon.png
│ ├── img
│ │ ├── favicon.png
│ │ ├── horizon.svg
│ │ └── sprite.svg
│ ├── manifest.json
│ ├── mix-manifest.json
│ ├── styles-dark.css
│ └── styles.css
│ └── telescope
│ ├── app-dark.css
│ ├── app.css
│ ├── app.js
│ ├── favicon.ico
│ └── mix-manifest.json
├── publiccode.yml
├── resources
├── audio
│ └── notification.mp3
├── custom
│ └── .gitignore
├── fonts
│ └── open-sans
│ │ ├── open-sans-300.woff2
│ │ ├── open-sans-300italic.woff2
│ │ ├── open-sans-500.woff2
│ │ ├── open-sans-500italic.woff2
│ │ ├── open-sans-600.woff2
│ │ ├── open-sans-600italic.woff2
│ │ ├── open-sans-700.woff2
│ │ ├── open-sans-700italic.woff2
│ │ ├── open-sans-800.woff2
│ │ ├── open-sans-800italic.woff2
│ │ ├── open-sans-italic.woff2
│ │ └── open-sans-regular.woff2
├── js
│ ├── app.js
│ ├── components
│ │ ├── AdminOverviewCard.vue
│ │ ├── AdminPanel.vue
│ │ ├── AdminStreamingRoomTypeEditButton.vue
│ │ ├── AdminStreamingRoomTypeTable.vue
│ │ ├── App.vue
│ │ ├── AppBanner.vue
│ │ ├── AppFooter.vue
│ │ ├── ColorSelect.vue
│ │ ├── FileInput.vue
│ │ ├── FormError.vue
│ │ ├── InlineNote.vue
│ │ ├── LandingFeaturesSection.vue
│ │ ├── LandingHeroCTA.vue
│ │ ├── LandingHeroSection.vue
│ │ ├── LandingHeroTitle.vue
│ │ ├── LandingHeroTitleFlipWords.vue
│ │ ├── LandingHeroTitleUnderlineWords.vue
│ │ ├── LoadingRetryButton.vue
│ │ ├── LocaleSelect.vue
│ │ ├── LoginTabExternal.vue
│ │ ├── LoginTabLdap.vue
│ │ ├── LoginTabLocal.vue
│ │ ├── MainNav.vue
│ │ ├── MainNavDarkModeToggle.vue
│ │ ├── OverlayComponent.vue
│ │ ├── RawText.vue
│ │ ├── RoleSelect.vue
│ │ ├── RoomBrowserNotification.vue
│ │ ├── RoomCard.vue
│ │ ├── RoomCardSkeleton.vue
│ │ ├── RoomCreateComponent.vue
│ │ ├── RoomDeleteButton.vue
│ │ ├── RoomDetailsList.vue
│ │ ├── RoomFavoriteButton.vue
│ │ ├── RoomHeader.vue
│ │ ├── RoomJoinButton.vue
│ │ ├── RoomMembershipButton.vue
│ │ ├── RoomRecordingAccessBadge.vue
│ │ ├── RoomRoleBadge.vue
│ │ ├── RoomSettingEnforcedIcon.vue
│ │ ├── RoomShareButton.vue
│ │ ├── RoomTabDescription.vue
│ │ ├── RoomTabDescriptionViewer.vue
│ │ ├── RoomTabFiles.vue
│ │ ├── RoomTabFilesDeleteButton.vue
│ │ ├── RoomTabFilesEditButton.vue
│ │ ├── RoomTabFilesUploadButton.vue
│ │ ├── RoomTabFilesViewButton.vue
│ │ ├── RoomTabHistory.vue
│ │ ├── RoomTabHistoryAttendanceButton.vue
│ │ ├── RoomTabHistoryStatisticButton.vue
│ │ ├── RoomTabMembers.vue
│ │ ├── RoomTabMembersAddButton.vue
│ │ ├── RoomTabMembersAddSingleModal.vue
│ │ ├── RoomTabMembersBulkDeleteButton.vue
│ │ ├── RoomTabMembersBulkEditButton.vue
│ │ ├── RoomTabMembersBulkImportList.vue
│ │ ├── RoomTabMembersBulkImportModal.vue
│ │ ├── RoomTabMembersDeleteButton.vue
│ │ ├── RoomTabMembersEditButton.vue
│ │ ├── RoomTabPersonalizedLinks.vue
│ │ ├── RoomTabPersonalizedLinksAddButton.vue
│ │ ├── RoomTabPersonalizedLinksCopyButton.vue
│ │ ├── RoomTabPersonalizedLinksDeleteButton.vue
│ │ ├── RoomTabPersonalizedLinksEditButton.vue
│ │ ├── RoomTabRecordings.vue
│ │ ├── RoomTabRecordingsDeleteButton.vue
│ │ ├── RoomTabRecordingsDownloadButton.vue
│ │ ├── RoomTabRecordingsEditButton.vue
│ │ ├── RoomTabRecordingsViewButton.vue
│ │ ├── RoomTabSection.vue
│ │ ├── RoomTabSettings.vue
│ │ ├── RoomTabSettingsAccessCodeInput.vue
│ │ ├── RoomTabSettingsExpertModeButton.vue
│ │ ├── RoomTabSettingsRadioGroup.vue
│ │ ├── RoomTabSettingsRoomTypeSelect.vue
│ │ ├── RoomTabSettingsSelectButton.vue
│ │ ├── RoomTabSettingsTextArea.vue
│ │ ├── RoomTabSettingsTextInput.vue
│ │ ├── RoomTabSettingsToggleSwitch.vue
│ │ ├── RoomTabStreaming.vue
│ │ ├── RoomTabStreamingConfigButton.vue
│ │ ├── RoomTransferOwnershipButton.vue
│ │ ├── RoomTypeBadge.vue
│ │ ├── RoomTypeChangeConfirmationModal.vue
│ │ ├── RoomTypeCompareSettingsField.vue
│ │ ├── RoomTypeDetails.vue
│ │ ├── RoomTypeFeatureField.vue
│ │ ├── RoomTypeSelect.vue
│ │ ├── RoomTypeSettingsField.vue
│ │ ├── SettingsFileSelector.vue
│ │ ├── SettingsImageSelector.vue
│ │ ├── SettingsRolesDeleteButton.vue
│ │ ├── SettingsRoomTypesDeleteButton.vue
│ │ ├── SettingsServerPoolsDeleteButton.vue
│ │ ├── SettingsServersDeleteButton.vue
│ │ ├── SettingsUsersDeleteButton.vue
│ │ ├── SettingsUsersResetPasswordButton.vue
│ │ ├── TextTruncate.vue
│ │ ├── TimezoneSelect.vue
│ │ ├── TipTapEditor.vue
│ │ ├── TipTapImage.vue
│ │ ├── TipTapLink.vue
│ │ ├── TipTapMenu.vue
│ │ ├── TipTapMenuDropdownButton.vue
│ │ ├── TipTapMenuDropdownItem.vue
│ │ ├── TipTapSource.vue
│ │ ├── UserAvatar.vue
│ │ ├── UserProfileImageSelector.vue
│ │ ├── UserTabEmail.vue
│ │ ├── UserTabOtherSettings.vue
│ │ ├── UserTabProfile.vue
│ │ ├── UserTabSection.vue
│ │ ├── UserTabSecurity.vue
│ │ ├── UserTabSecurityPasswordSection.vue
│ │ ├── UserTabSecurityRolesAndPermissionsSection.vue
│ │ └── UserTabSecuritySessionsSection.vue
│ ├── composables
│ │ ├── useActionColumn.js
│ │ ├── useApi.js
│ │ ├── useColors.js
│ │ ├── useDateDiff.js
│ │ ├── useFormErrors.js
│ │ ├── usePaginator.js
│ │ ├── useRoomHelpers.js
│ │ ├── useRoomTypeSettings.js
│ │ ├── useTheme.js
│ │ ├── useToast.js
│ │ └── useUserPermission.js
│ ├── constants
│ │ ├── events.js
│ │ └── roomSettings.js
│ ├── env.js
│ ├── errors
│ │ ├── ParameterMissingError.js
│ │ ├── PolicyDoesNotExistsError.js
│ │ └── WrongTypeError.js
│ ├── font.js
│ ├── i18n.js
│ ├── plugins
│ │ └── toast.js
│ ├── policies
│ │ ├── AdminPolicy.js
│ │ ├── MeetingPolicy.js
│ │ ├── RolePolicy.js
│ │ ├── RoomPolicy.js
│ │ ├── RoomTypePolicy.js
│ │ ├── ServerPolicy.js
│ │ ├── ServerPoolPolicy.js
│ │ ├── SettingsPolicy.js
│ │ ├── StreamingPolicy.js
│ │ ├── SystemPolicy.js
│ │ ├── UserPolicy.js
│ │ └── index.js
│ ├── router.js
│ ├── services
│ │ ├── Api.js
│ │ └── EventBus.js
│ ├── stores
│ │ ├── auth.js
│ │ ├── loading.js
│ │ ├── locale.js
│ │ └── settings.js
│ └── views
│ │ ├── AdminIndex.vue
│ │ ├── AdminLayout.vue
│ │ ├── AdminRolesIndex.vue
│ │ ├── AdminRolesView.vue
│ │ ├── AdminRoomTypesIndex.vue
│ │ ├── AdminRoomTypesView.vue
│ │ ├── AdminServerPoolsIndex.vue
│ │ ├── AdminServerPoolsView.vue
│ │ ├── AdminServersIndex.vue
│ │ ├── AdminServersView.vue
│ │ ├── AdminSettings.vue
│ │ ├── AdminStreamingSettings.vue
│ │ ├── AdminUsersIndex.vue
│ │ ├── AdminUsersNew.vue
│ │ ├── AdminUsersView.vue
│ │ ├── ExternalLogin.vue
│ │ ├── ForgotPassword.vue
│ │ ├── Home.vue
│ │ ├── Login.vue
│ │ ├── Logout.vue
│ │ ├── MeetingsIndex.vue
│ │ ├── NotFound.vue
│ │ ├── PasswordReset.vue
│ │ ├── Profile.vue
│ │ ├── RoomsIndex.vue
│ │ ├── RoomsView.vue
│ │ └── VerifyEmail.vue
├── sass
│ ├── app.scss
│ ├── app
│ │ ├── _action-column.scss
│ │ ├── _color-select.scss
│ │ ├── _general.scss
│ │ ├── _navigation.scss
│ │ ├── _profile-image.scss
│ │ ├── _room.scss
│ │ ├── _streched-link.scss
│ │ ├── _typography.scss
│ │ └── app.scss
│ └── override
│ │ ├── _multiselect.scss
│ │ ├── _toast.scss
│ │ ├── _tooltip.scss
│ │ └── override.scss
└── views
│ ├── application.blade.php
│ ├── frontend-error.blade.php
│ └── vendor
│ ├── mail
│ └── html
│ │ └── themes
│ │ └── default.css
│ ├── notifications
│ └── email.blade.php
│ └── pulse
│ └── dashboard.blade.php
├── routes
├── api.php
├── channels.php
├── console.php
└── web.php
├── sail
├── ssl
└── .gitignore
├── storage
├── app
│ ├── .gitignore
│ └── public
│ │ └── .gitignore
├── framework
│ ├── .gitignore
│ ├── cache
│ │ ├── .gitignore
│ │ └── data
│ │ │ └── .gitignore
│ ├── sessions
│ │ └── .gitignore
│ ├── testing
│ │ └── .gitignore
│ └── views
│ │ └── .gitignore
├── logs
│ └── .gitignore
├── recordings-spool
│ └── .gitignore
└── recordings
│ └── .gitignore
├── tailwind.config.js
├── tests
├── Backend
│ ├── Feature
│ │ ├── RoutingTest.php
│ │ └── api
│ │ │ └── v1
│ │ │ ├── ApplicationTest.php
│ │ │ ├── ForgotPasswordTest.php
│ │ │ ├── LdapLoginTest.php
│ │ │ ├── LocalesTest.php
│ │ │ ├── LoginTest.php
│ │ │ ├── MeetingTest.php
│ │ │ ├── PermissionTest.php
│ │ │ ├── RecordingTest.php
│ │ │ ├── ResetPasswordTest.php
│ │ │ ├── RoleTest.php
│ │ │ ├── Room
│ │ │ ├── FileTest.php
│ │ │ ├── MembershipTest.php
│ │ │ ├── RoomDescriptionTest.php
│ │ │ ├── RoomStatisticTest.php
│ │ │ ├── RoomStreamingTest.php
│ │ │ ├── RoomTest.php
│ │ │ └── RoomTokenTest.php
│ │ │ ├── RoomTypeTest.php
│ │ │ ├── ServerPoolTest.php
│ │ │ ├── ServerTest.php
│ │ │ ├── SessionTest.php
│ │ │ ├── SettingsTest.php
│ │ │ ├── ShibbolethTest.php
│ │ │ ├── StreamingTest.php
│ │ │ └── UserTest.php
│ ├── Fixtures
│ │ ├── ChecksumError.xml
│ │ ├── EndMeeting.xml
│ │ ├── Failed.xml
│ │ ├── GetApiVersion-Disabled.xml
│ │ ├── GetApiVersion.xml
│ │ ├── GetMeetings-1.xml
│ │ ├── GetMeetings-2.xml
│ │ ├── GetMeetings-3.xml
│ │ ├── GetMeetings-Empty.xml
│ │ ├── GetMeetings-End.xml
│ │ ├── GetMeetings-MaxUsers.xml
│ │ ├── GetMeetings-Start.xml
│ │ ├── Locales
│ │ │ ├── .gitignore
│ │ │ ├── custom
│ │ │ │ ├── de
│ │ │ │ │ ├── app.php
│ │ │ │ │ └── metadata.json
│ │ │ │ ├── en
│ │ │ │ │ ├── app.php
│ │ │ │ │ └── metadata.json
│ │ │ │ ├── es
│ │ │ │ │ └── app.php
│ │ │ │ └── fr
│ │ │ │ │ └── app.php
│ │ │ └── default
│ │ │ │ ├── en
│ │ │ │ ├── app.php
│ │ │ │ └── metadata.json
│ │ │ │ └── fr
│ │ │ │ ├── app.php
│ │ │ │ └── metadata.json
│ │ ├── MeetingNotFound.xml
│ │ ├── Recordings
│ │ │ ├── invalid-recording.tar
│ │ │ ├── multiple.tar
│ │ │ ├── notes.tar
│ │ │ └── other-file.txt
│ │ ├── Success.xml
│ │ ├── invalidDatabase.sql
│ │ ├── profileImage-1.jpg
│ │ ├── profileImage-2.jpg
│ │ ├── provisioning_data.json
│ │ ├── validDatabase-mysql.sql
│ │ └── validDatabase-postgres.sql
│ ├── Integration
│ │ └── api
│ │ │ └── v1
│ │ │ ├── RoomFileTest.php
│ │ │ └── RoomTest.php
│ ├── TestCase.php
│ ├── Unit
│ │ ├── AddsModelNameTraitTest.php
│ │ ├── Console
│ │ │ ├── CleanupAttendanceTest.php
│ │ │ ├── CleanupRecordingsCommandTest.php
│ │ │ ├── CleanupRoomsTest.php
│ │ │ ├── CleanupStatisticsTest.php
│ │ │ ├── CreateSuperuserTest.php
│ │ │ ├── DeleteObsoleteTokensTest.php
│ │ │ ├── DeleteUnverifiedNewUsersTest.php
│ │ │ ├── ExportLocalesTest.php
│ │ │ ├── ImportDatabaseTest.php
│ │ │ ├── ImportGreenlight2Test.php
│ │ │ ├── ImportLocalesTest.php
│ │ │ ├── ImportRecordingsCommandTest.php
│ │ │ ├── LocalesCacheTest.php
│ │ │ ├── PollServerTest.php
│ │ │ ├── ProvisionCommandTest.php
│ │ │ ├── TestEmailConfigTest.php
│ │ │ ├── UpgradeDatabaseTest.php
│ │ │ ├── UploadLocalesTest.php
│ │ │ └── helper
│ │ │ │ ├── GreenlightRoom.php
│ │ │ │ ├── GreenlightSharedAccess.php
│ │ │ │ └── GreenlightUser.php
│ │ ├── EnsureModelNotStaleTest.php
│ │ ├── ExternalUserTest.php
│ │ ├── Jobs
│ │ │ └── ProcessRecordingTest.php
│ │ ├── Listeners
│ │ │ └── ResetStreamingOnRoomStop.php
│ │ ├── LocaleServiceTest.php
│ │ ├── MeetingServiceTest.php
│ │ ├── MeetingTest.php
│ │ ├── PermissionTest.php
│ │ ├── ProvisioningServiceTest.php
│ │ ├── RoomTest.php
│ │ ├── RoomTokenTest.php
│ │ ├── Rules
│ │ │ ├── CustomCreateMeetingParametersTest.php
│ │ │ ├── PasswordTest.php
│ │ │ └── ValidRoomTypeTest.php
│ │ ├── Seeder
│ │ │ └── RolesAndPermissionsSeederTest.php
│ │ ├── ServerLoadCalculationPluginTest.php
│ │ ├── ServerPoolTest.php
│ │ ├── ServerServiceTest.php
│ │ ├── ServerTest.php
│ │ ├── StreamingServiceFactoryTest.php
│ │ ├── StreamingServiceTest.php
│ │ └── UserTest.php
│ └── Utils
│ │ ├── AttendanceExcelImport.php
│ │ ├── BigBlueButtonServerFaker.php
│ │ ├── FileHelper.php
│ │ └── ServerLoadCalculationPlugin.php
├── Frontend
│ ├── e2e
│ │ ├── AdminIndex.cy.js
│ │ ├── AdminRolesEdit.cy.js
│ │ ├── AdminRolesIndex.cy.js
│ │ ├── AdminRolesIndexRoleActions.cy.js
│ │ ├── AdminRolesNew.cy.js
│ │ ├── AdminRolesView.cy.js
│ │ ├── AdminRolesViewRoleActions.cy.js
│ │ ├── AdminRoomTypesEdit.cy.js
│ │ ├── AdminRoomTypesIndex.cy.js
│ │ ├── AdminRoomTypesIndexRoomTypeActions.cy.js
│ │ ├── AdminRoomTypesNew.cy.js
│ │ ├── AdminRoomTypesView.cy.js
│ │ ├── AdminRoomTypesViewRoomTypeActions.cy.js
│ │ ├── AdminServerPoolsEdit.cy.js
│ │ ├── AdminServerPoolsIndex.cy.js
│ │ ├── AdminServerPoolsIndexServerPoolActions.cy.js
│ │ ├── AdminServerPoolsNew.cy.js
│ │ ├── AdminServerPoolsView.cy.js
│ │ ├── AdminServerPoolsViewServerPoolActions.cy.js
│ │ ├── AdminServersEdit.cy.js
│ │ ├── AdminServersIndex.cy.js
│ │ ├── AdminServersIndexServerActions.cy.js
│ │ ├── AdminServersNew.cy.js
│ │ ├── AdminServersView.cy.js
│ │ ├── AdminServersViewServerActions.cy.js
│ │ ├── AdminSettingsEdit.cy.js
│ │ ├── AdminSettingsGeneral.cy.js
│ │ ├── AdminSettingsView.cy.js
│ │ ├── AdminStreamingEdit.cy.js
│ │ ├── AdminStreamingView.cy.js
│ │ ├── AdminUsersEdit.cy.js
│ │ ├── AdminUsersEditBase.cy.js
│ │ ├── AdminUsersEditEmail.cy.js
│ │ ├── AdminUsersEditOthers.cy.js
│ │ ├── AdminUsersEditSecurity.cy.js
│ │ ├── AdminUsersIndex.cy.js
│ │ ├── AdminUsersIndexUserActions.cy.js
│ │ ├── AdminUsersNew.cy.js
│ │ ├── AdminUsersView.cy.js
│ │ ├── AdminUsersViewUserActions.cy.js
│ │ ├── Banner.cy.js
│ │ ├── Footer.cy.js
│ │ ├── ForgotPassword.cy.js
│ │ ├── GeneralApplication.cy.js
│ │ ├── Login.cy.js
│ │ ├── Logout.cy.js
│ │ ├── MeetingsIndex.cy.js
│ │ ├── PasswordReset.cy.js
│ │ ├── RoomsIndex.cy.js
│ │ ├── RoomsIndexCreateNewRoom.cy.js
│ │ ├── RoomsViewBrowserNotification.cy.js
│ │ ├── RoomsViewDescription.cy.js
│ │ ├── RoomsViewDescriptionTipTapEditor.cy.js
│ │ ├── RoomsViewFiles.cy.js
│ │ ├── RoomsViewFilesFileActions.cy.js
│ │ ├── RoomsViewGeneral.cy.js
│ │ ├── RoomsViewHistory.cy.js
│ │ ├── RoomsViewHistoryMeetingActions.cy.js
│ │ ├── RoomsViewMeetings.cy.js
│ │ ├── RoomsViewMembers.cy.js
│ │ ├── RoomsViewMembersBulkActions.cy.js
│ │ ├── RoomsViewMembersMemberActions.cy.js
│ │ ├── RoomsViewPersonalizedLinks.cy.js
│ │ ├── RoomsViewPersonalizedLinksTokenActions.cy.js
│ │ ├── RoomsViewRecordings.cy.js
│ │ ├── RoomsViewRecordingsRecordingActions.cy.js
│ │ ├── RoomsViewSettings.cy.js
│ │ ├── RoomsViewSettingsRoomTypeActions.cy.js
│ │ ├── RoomsViewStreaming.cy.js
│ │ ├── RoomsViewStreamingConfigActions.cy.js
│ │ ├── UserProfile.cy.js
│ │ ├── UserProfileBase.cy.js
│ │ ├── UserProfileEmail.cy.js
│ │ ├── UserProfileOthers.cy.js
│ │ ├── UserProfileSecurity.cy.js
│ │ └── VerifyEmail.cy.js
│ ├── fixtures
│ │ ├── config.json
│ │ ├── currentUser.json
│ │ ├── en.json
│ │ ├── files
│ │ │ ├── bbb_style.css
│ │ │ ├── favicon-dark.ico
│ │ │ ├── favicon.ico
│ │ │ ├── logo-dark.svg
│ │ │ ├── logo.svg
│ │ │ ├── pause.jpg
│ │ │ ├── profileImage.jpg
│ │ │ ├── profileImagePreview.jpg
│ │ │ ├── streaming.css
│ │ │ ├── testFile.txt
│ │ │ └── testFile2.txt
│ │ ├── meetings.json
│ │ ├── permissions.json
│ │ ├── role.json
│ │ ├── roles.json
│ │ ├── room.json
│ │ ├── roomFiles.json
│ │ ├── roomFilesNoDetails.json
│ │ ├── roomHistory.json
│ │ ├── roomHistoryAttendance.json
│ │ ├── roomHistoryStats.json
│ │ ├── roomMembers.json
│ │ ├── roomRecordings.json
│ │ ├── roomSettings.json
│ │ ├── roomStreamingConfig.json
│ │ ├── roomStreamingStatus.json
│ │ ├── roomTokens.json
│ │ ├── roomType.json
│ │ ├── roomTypeStreamingSettings.json
│ │ ├── roomTypes.json
│ │ ├── roomTypesWithSettings.json
│ │ ├── rooms.json
│ │ ├── server.json
│ │ ├── serverPool.json
│ │ ├── serverPools.json
│ │ ├── servers.json
│ │ ├── sessions.json
│ │ ├── settings.json
│ │ ├── streaming.json
│ │ ├── superuserRole.json
│ │ ├── timezones.json
│ │ ├── userDataCurrentUser.json
│ │ ├── userDataUser.json
│ │ └── users.json
│ └── support
│ │ ├── commands
│ │ ├── adminRolesCommands.js
│ │ ├── adminRoomTypesCommands.js
│ │ ├── adminSettingsCommands.js
│ │ ├── generalCommands.js
│ │ ├── interceptCommands.js
│ │ └── roomCommands.js
│ │ ├── component-index.html
│ │ ├── component.js
│ │ ├── e2e.js
│ │ └── utils
│ │ ├── fileHelper.js
│ │ ├── formData.js
│ │ ├── interceptIndefinitely.js
│ │ ├── notificationFaker.js
│ │ └── tiptapHelper.js
├── System
│ ├── cypress.config.js
│ ├── e2e
│ │ ├── GeneralApplication.cy.js
│ │ ├── Login.cy.js
│ │ ├── RoomsIndex.cy.js
│ │ └── RoomsViewGeneral.cy.js
│ └── support
│ │ ├── commands.js
│ │ └── e2e.js
├── Utils
│ ├── create-mariadb-testing-database.sh
│ └── create-postgres-testing-database.sql
└── Visual
│ ├── .happo.js
│ ├── cypress.config.js
│ ├── e2e
│ └── RoomsViewHistoryMeetingActions.cy.js
│ ├── fixtures
│ ├── config.json
│ ├── currentUser.json
│ ├── room.json
│ ├── roomHistory.json
│ ├── roomHistoryStats.json
│ └── roomTypes.json
│ └── support
│ ├── commands.js
│ ├── commands
│ └── interceptCommands.js
│ └── e2e.js
├── vite.config.common.js
├── vite.config.coverage.js
└── vite.config.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "test": {
4 | "presets": [["@babel/preset-env"]],
5 | "retainLines": true
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | /.idea
3 | node_modules
4 | vendor
5 | .env
6 | .github
7 | .opencode
8 | *.md
9 | _ide_helper.php
10 | tests
11 | .eslintignore
12 | .eslintrc.js
13 | .gitattributes
14 | .gitignore
15 | .php-cs-fixer.php
16 | .phpunit.result.cache
17 | .styleci.yml
18 | phpunit.xml
19 | docs
20 | ssl
21 | db
22 | redis
23 | app/Auth/config
24 | app/Plugins/Custom
25 | public/hot
26 |
27 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | end_of_line = lf
6 | insert_final_newline = true
7 | indent_style = space
8 | indent_size = 4
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
14 | [*.{yml,yaml,js,vue,json}]
15 | indent_size = 2
16 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
2 | *.{cmd,[cC][mM][dD]} text eol=crlf
3 | *.{bat,[bB][aA][tT]} text eol=crlf
4 | *.css linguist-vendored
5 | *.scss linguist-vendored
6 | *.js linguist-vendored
7 | CHANGELOG.md export-ignore
8 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ""
5 | labels: ""
6 | assignees: ""
7 | ---
8 |
9 | **Is your feature request related to a problem? Please describe.**
10 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
11 |
12 | **Describe the solution you'd like**
13 | A clear and concise description of what you want to happen.
14 |
15 | **Describe alternatives you've considered**
16 | A clear and concise description of any alternative solutions or features you've considered.
17 |
18 | **Additional context**
19 | Add any other context or screenshots about the feature request here.
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /public/hot
3 | /public/storage
4 | /storage/*.key
5 | /vendor
6 | .env
7 | .env.backup
8 | .phpunit.result.cache
9 | docker-compose.override.yml
10 | npm-debug.log
11 | yarn-error.log
12 | /.idea
13 | /.vscode
14 | .DS_Store
15 | /public/build
16 | /public/fonts
17 | .nyc_output
18 | coverage
19 | coverage.xml
20 | /db
21 | /redis
22 | version
23 | components.d.ts
24 | public/playback-player
25 | tests/Frontend/screenshots
26 | tests/Frontend/videos
27 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict
2 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | lts/*
2 |
--------------------------------------------------------------------------------
/.nycrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "all": true,
3 | "excludeAfterRemap": false,
4 | "reporter": ["json"],
5 | "extension": [".js", ".vue"],
6 | "include": ["resources/js/*"]
7 | }
8 |
--------------------------------------------------------------------------------
/.opencode/screenshots/de/app_settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/app_settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/dashboard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/dashboard.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/home.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/home.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/login.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/profile_base.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/profile_base.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/profile_security.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/profile_security.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/roles.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/roles.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/roles_detail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/roles_detail.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_attendance.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_attendance.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_description.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_description.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_files.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_files.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_history.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_history.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_members.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_members.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_personalized_room_links.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_personalized_room_links.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_stats.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_stats.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_types.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_types.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_types_edit.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_types_edit.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/room_types_edit_settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/room_types_edit_settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/running_meetings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/running_meetings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/server_pools.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/server_pools.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/servers.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/servers.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/servers_edit.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/servers_edit.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/de/users.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/de/users.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/app_settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/app_settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/dashboard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/dashboard.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/home.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/home.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/login.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/profile_base.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/profile_base.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/profile_security.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/profile_security.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/roles.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/roles.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/roles_detail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/roles_detail.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_attendance.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_attendance.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_description.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_description.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_files.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_files.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_history.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_history.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_members.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_members.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_personalized_room_links.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_personalized_room_links.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_stats.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_stats.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_types.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_types.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_types_edit.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_types_edit.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/room_types_edit_settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/room_types_edit_settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/running_meetings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/running_meetings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/server_pools.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/server_pools.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/servers.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/servers.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/servers_edit.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/servers_edit.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/settings.jpg
--------------------------------------------------------------------------------
/.opencode/screenshots/en/users.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/.opencode/screenshots/en/users.jpg
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore artifacts:
2 | build
3 | coverage
4 | lang
5 | public
6 | storage
7 | composer.lock
8 | package-lock.json
9 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": ["prettier-plugin-tailwindcss"]
3 | }
4 |
--------------------------------------------------------------------------------
/.styleci.yml:
--------------------------------------------------------------------------------
1 | php:
2 | preset: laravel
3 | disabled:
4 | - no_unused_imports
5 | finder:
6 | not-name:
7 | - index.php
8 | - server.php
9 | js:
10 | finder:
11 | not-name:
12 | - webpack.mix.js
13 | css: true
14 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | We actively support PILOS through the matrix chat and through security updates.
6 |
7 | | Version | Supported |
8 | | ------- | ------------------ |
9 | | 4.x | :white_check_mark: |
10 | | 3.x | :x: |
11 | | 2.x | :x: |
12 | | 1.x | :x: |
13 |
14 | ## Reporting a Vulnerability
15 |
16 | If you believe you have found a security vunerability in PILOS please let us know directly by using GitHub's "Report a vulnerability" functionality on https://github.com/THM-Health/PILOS/security/advisories
17 |
--------------------------------------------------------------------------------
/app/Auth/MissingAttributeException.php:
--------------------------------------------------------------------------------
1 | app->singleton(ShibbolethProvider::class, function (Application $app) {
16 | return new ShibbolethProvider;
17 | });
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/app/Auth/Shibboleth/ShibbolethSessionDuplicateException.php:
--------------------------------------------------------------------------------
1 | hashShibbolethSessionId($SessionID);
16 | $lookupSessions = SessionData::where('key', 'shibboleth_session_id')->where('value', $hashShibbolethSessionId)->get();
17 | foreach ($lookupSessions as $lookupSession) {
18 | $lookupSession->session()->delete();
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Auth/config/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
--------------------------------------------------------------------------------
/app/Enums/CustomStatusCodes.php:
--------------------------------------------------------------------------------
1 | 'Guest',
20 | RoomUserRole::USER => 'User',
21 | RoomUserRole::MODERATOR => 'Moderator',
22 | RoomUserRole::CO_OWNER => 'Co-Owner',
23 | RoomUserRole::OWNER => 'Owner',
24 | };
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Enums/RoomVisibility.php:
--------------------------------------------------------------------------------
1 | room;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Events/RoomStarted.php:
--------------------------------------------------------------------------------
1 | room;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Exceptions/RecordingExtractionFailed.php:
--------------------------------------------------------------------------------
1 | generator->sentence($length, false), 0, $length);
20 |
21 | // Replace the last character of the text with '.' if it is ' '
22 | if ($text[$length - 1] === ' ') {
23 | $text[$length - 1] = '.';
24 | }
25 |
26 | return $text;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/Http/Controllers/ApplicationController.php:
--------------------------------------------------------------------------------
1 | download();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Controllers/api/v1/ApplicationController.php:
--------------------------------------------------------------------------------
1 | withPermissions()->withoutRoles();
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Http/Controllers/api/v1/PermissionController.php:
--------------------------------------------------------------------------------
1 | additional([
19 | 'meta' => [
20 | 'restrictions' => config('permissions.restrictions'),
21 | ],
22 | ]);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/Http/Controllers/api/v1/SessionController.php:
--------------------------------------------------------------------------------
1 | sessions()->orderByDesc('last_activity')->get());
15 | }
16 |
17 | public function destroy()
18 | {
19 | $authService = new AuthenticationService(Auth::user());
20 | $authService->logoutOtherSessions(session()->getId());
21 |
22 | return response()->noContent();
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/Http/Middleware/Authenticate.php:
--------------------------------------------------------------------------------
1 | expectsJson() ? null : URL::to('/login');
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/Http/Middleware/EncryptCookies.php:
--------------------------------------------------------------------------------
1 | check()) {
24 | return (new Response('Guests only.'))->setStatusCode(420, 'Guests only');
25 | }
26 | }
27 |
28 | return $next($request);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/Http/Middleware/TrimStrings.php:
--------------------------------------------------------------------------------
1 |
13 | */
14 | public function hosts(): array
15 | {
16 | $url = parse_url(config('app.url'), PHP_URL_HOST);
17 |
18 | return [$url];
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/Http/Middleware/TrustProxies.php:
--------------------------------------------------------------------------------
1 | proxies = config('app.trusted_proxies');
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Http/Middleware/VerifyCsrfToken.php:
--------------------------------------------------------------------------------
1 | ['required', 'integer', 'exists:App\Models\User,id',
15 | function ($attribute, $value, $fail) {
16 | if ($this->room->members()->find($value) or $this->room->owner->id == $value) {
17 | $fail(__('validation.custom.room.already_member'));
18 | }
19 | }],
20 | 'role' => ['required', Rule::in([RoomUserRole::USER, RoomUserRole::MODERATOR, RoomUserRole::CO_OWNER])],
21 | ];
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/Http/Requests/ChangeEmailRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')->where(function ($query) {
20 | return $query->where('authenticator', '=', 'local')->where('id', '!=', $this->user->id);
21 | })],
22 | 'current_password' => $this->user->is(Auth::user()) ? ['required', 'current_password'] : [],
23 | ];
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Http/Requests/ChangeLocaleRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'string', Rule::in(array_keys(config('app.enabled_locales')))],
19 | ];
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Http/Requests/ChangePasswordRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'string', 'min:8', 'confirmed', new Password],
20 | 'current_password' => $this->user->is(Auth::user()) ? ['required', 'current_password'] : [],
21 | ];
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/Http/Requests/CreateRoom.php:
--------------------------------------------------------------------------------
1 | ['bail', 'required', 'integer', 'exists:App\Models\RoomType,id', new ValidRoomType(Auth::user())],
15 | 'name' => ['required', 'string', 'min:2', 'max:'.config('bigbluebutton.room_name_limit')],
16 | ];
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/Http/Requests/RoomTokenRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'min:2', 'max:50', new ValidName],
16 | 'lastname' => ['required', 'min:2', 'max:50', new ValidName],
17 | 'role' => ['required', Rule::in([RoomUserRole::USER, RoomUserRole::MODERATOR])],
18 | ];
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/Http/Requests/RoomTypeDestroyRequest.php:
--------------------------------------------------------------------------------
1 | ['nullable', Rule::requiredIf($this->roomType->rooms()->count() > 0), 'integer', 'exists:App\Models\RoomType,id', Rule::notIn([$this->roomType->id])],
14 | ];
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/Http/Requests/ServerConnectionCheckRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'url', 'string', 'max:255'],
13 | 'secret' => ['required', 'string', 'max:255'],
14 | ];
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/Http/Requests/ServerPoolRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'string', 'max:255', Rule::unique('server_pools', 'name')],
14 | 'description' => ['nullable', 'string', 'max:255'],
15 | 'servers' => 'array',
16 | 'servers.*' => ['distinct', 'integer', 'exists:App\Models\Server,id'],
17 | ];
18 |
19 | if ($this->serverPool) {
20 | $rules['name'] = ['required', 'string', 'max:255', Rule::unique('server_pools', 'name')->ignore($this->serverPool->id)];
21 | }
22 |
23 | return $rules;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Http/Requests/StoreRoomFile.php:
--------------------------------------------------------------------------------
1 | ['required', 'file', 'max:'.(config('bigbluebutton.max_filesize') * 1000), 'mimes:'.config('bigbluebutton.allowed_file_mimes')], // https://github.com/bigbluebutton/bigbluebutton/blob/v2.2.x-release/bigbluebutton-html5/private/config/settings.yml
13 | ];
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/app/Http/Requests/UpdateRecordingRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'string', 'max:'.config('recording.description_limit')],
15 | 'access' => ['required', Rule::enum(RecordingAccess::class)],
16 | 'formats' => ['required', 'array'],
17 | 'formats.*.id' => ['required', 'distinct', Rule::in($this->recording->formats->pluck('id')->toArray())],
18 | 'formats.*.disabled' => ['required', 'boolean'],
19 | ];
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Http/Requests/UpdateRoomDescription.php:
--------------------------------------------------------------------------------
1 | ['nullable', 'string', 'max:65000'],
13 | ];
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/app/Http/Requests/UpdateRoomFile.php:
--------------------------------------------------------------------------------
1 | ['required', 'boolean'],
13 | 'download' => ['required', 'boolean'],
14 | 'default' => ['required', 'boolean'],
15 | ];
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/Http/Requests/UpdateRoomMember.php:
--------------------------------------------------------------------------------
1 | ['required', Rule::in([RoomUserRole::USER, RoomUserRole::MODERATOR, RoomUserRole::CO_OWNER])],
15 | ];
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/Http/Requests/UpdateRoomTypeStreamingSettings.php:
--------------------------------------------------------------------------------
1 | ['required', 'boolean'],
18 | 'default_pause_image' => ['nullable', 'image', 'mimes:jpg,bmp,png,gif', 'max:5000', 'dimensions:width=1920,height=1080'], // 5 MB
19 | ];
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Http/Requests/UpdateStreamingSettings.php:
--------------------------------------------------------------------------------
1 | ['nullable', 'image', 'mimes:jpg,bmp,png,gif', 'max:5000', 'dimensions:width=1920,height=1080'], // 5 MB
19 | 'css_file' => ['nullable', 'file', 'max:500', 'extensions:css'],
20 | 'join_parameters' => ['nullable', 'string', 'max:65000', new CustomJoinMeetingParameters],
21 | ];
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/Http/Requests/VerifyEmailRequest.php:
--------------------------------------------------------------------------------
1 | ['required', 'string'],
18 | 'email' => ['required', 'string'],
19 | ];
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Http/Resources/Attendee.php:
--------------------------------------------------------------------------------
1 | $this['name'],
17 | 'email' => $this['email'],
18 | 'duration' => $this['duration'],
19 | 'sessions' => AttendeeSession::collection($this['sessions']),
20 | ];
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/Http/Resources/AttendeeSession.php:
--------------------------------------------------------------------------------
1 | $this['id'],
17 | 'join' => $this['join'],
18 | 'leave' => $this['leave'],
19 | 'duration' => $this['duration'],
20 | ];
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/Http/Resources/LastMeeting.php:
--------------------------------------------------------------------------------
1 | $this->start,
19 | 'end' => $this->end,
20 | 'detached' => $this->detached,
21 | 'usage' => $this->when($this->end == null, [
22 | 'participant_count' => $this->room->participant_count,
23 | ]),
24 | 'server_connection_issues' => $this->end == null && $this->server->error_count > 0,
25 | ];
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/Http/Resources/Meeting.php:
--------------------------------------------------------------------------------
1 | $this->id,
20 | 'start' => $this->start,
21 | 'end' => $this->end,
22 | 'attendance' => $this->attendees()->count() > 0,
23 | 'statistical' => app(RecordingSettings::class)->meeting_usage_enabled && $this->stats()->count() > 0,
24 | ];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Resources/MeetingStat.php:
--------------------------------------------------------------------------------
1 | $this->id,
19 | 'participant_count' => $this->participant_count,
20 | 'listener_count' => $this->listener_count,
21 | 'voice_participant_count' => $this->voice_participant_count,
22 | 'video_count' => $this->video_count,
23 | 'created_at' => $this->created_at,
24 | ];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Resources/PermissionResourceCollection.php:
--------------------------------------------------------------------------------
1 | $this->collection->map(function (\App\Models\Permission $resource) {
18 | return (new Permission($resource))->withIncludedPermissions();
19 | })->all(),
20 | ];
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/Http/Resources/PrivateRoomFile.php:
--------------------------------------------------------------------------------
1 | $this->id,
19 | 'filename' => $this->filename,
20 | 'download' => $this->download,
21 | 'use_in_meeting' => $this->use_in_meeting,
22 | 'default' => $this->default,
23 | 'uploaded' => $this->created_at,
24 | ];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Resources/RecordingFormatResource.php:
--------------------------------------------------------------------------------
1 | $this->id,
18 | 'format' => $this->format,
19 | 'disabled' => $this->disabled,
20 | ];
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/Http/Resources/RecordingResource.php:
--------------------------------------------------------------------------------
1 | $this->id,
18 | 'start' => $this->start,
19 | 'end' => $this->end,
20 | 'description' => $this->description,
21 | 'access' => $this->access,
22 | 'formats' => RecordingFormatResource::collection($this->formats->sortBy('format')),
23 | ];
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Http/Resources/RoomFile.php:
--------------------------------------------------------------------------------
1 | $this->id,
19 | 'filename' => $this->filename,
20 | 'uploaded' => $this->created_at,
21 | ];
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/Http/Resources/RoomStreaming.php:
--------------------------------------------------------------------------------
1 |
14 | */
15 | public function toArray(Request $request): array
16 | {
17 | return [
18 | 'enabled_for_current_meeting' => $this->enabled_for_current_meeting,
19 | 'status' => $this->status,
20 | 'fps' => $this->fps,
21 | ];
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/Http/Resources/RoomStreamingConfig.php:
--------------------------------------------------------------------------------
1 |
14 | */
15 | public function toArray(Request $request): array
16 | {
17 | return [
18 | 'enabled' => $this->enabled,
19 | 'url' => $this->url,
20 | 'pause_image' => $this->pause_image,
21 | 'room_type_default_pause_image' => $this->resource->room->roomType->streamingSettings->default_pause_image,
22 | 'system_default_pause_image' => app(\App\Settings\StreamingSettings::class)->default_pause_image,
23 | ];
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Http/Resources/RoomToken.php:
--------------------------------------------------------------------------------
1 | $this->token,
19 | 'firstname' => $this->firstname,
20 | 'lastname' => $this->lastname,
21 | 'role' => $this->role,
22 | 'expires' => $this->expires,
23 | 'last_usage' => $this->last_usage,
24 | ];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Resources/RoomTypeStreamingSettings.php:
--------------------------------------------------------------------------------
1 |
14 | */
15 | public function toArray(Request $request): array
16 | {
17 | return [
18 | 'enabled' => $this->enabled,
19 | 'default_pause_image' => $this->default_pause_image,
20 | ];
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/Http/Resources/RoomUser.php:
--------------------------------------------------------------------------------
1 | $this->id,
19 | 'firstname' => $this->firstname,
20 | 'lastname' => $this->lastname,
21 | 'email' => $this->email,
22 | 'role' => $this->pivot->role,
23 | 'image' => $this->imageUrl,
24 | ];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Resources/SessionResource.php:
--------------------------------------------------------------------------------
1 | $this->last_activity,
19 | 'ip_address' => $this->ip_address,
20 | 'user_agent' => $this->user_agent,
21 | 'current' => $this->id === session()->getId(),
22 | ];
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/Listeners/FailedLoginAttempt.php:
--------------------------------------------------------------------------------
1 | guard == 'ldap') {
28 | Log::notice('External user '.$event->credentials['username'].' has failed authentication.', ['type' => 'ldap']);
29 | } else {
30 | Log::notice('Local user '.$event->credentials['email'].' has failed local authentication.');
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/Listeners/ResetStreamingOnRoomStop.php:
--------------------------------------------------------------------------------
1 | getRoom();
25 |
26 | $room->streaming->status = null;
27 | $room->streaming->fps = null;
28 | $room->streaming->save();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/Models/IncludedPermissionPermission.php:
--------------------------------------------------------------------------------
1 | 'integer',
18 | 'listener_count' => 'integer',
19 | 'voice_participant_count' => 'integer',
20 | 'video_count' => 'integer',
21 | ];
22 |
23 | /**
24 | * Meeting the statistical data belongs to
25 | *
26 | * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
27 | */
28 | public function meeting()
29 | {
30 | return $this->belongsTo(Meeting::class);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Models/PermissionRole.php:
--------------------------------------------------------------------------------
1 | 'boolean'];
10 |
11 | protected static function booted(): void
12 | {
13 | static::created(function () {
14 | User::$clearPermissionCache = true;
15 | });
16 |
17 | static::deleted(function () {
18 | User::$clearPermissionCache = true;
19 | });
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Models/RoomTypeStreamingSettings.php:
--------------------------------------------------------------------------------
1 | 'boolean',
24 | ];
25 |
26 | protected $with = ['roomType'];
27 |
28 | public function roomType(): BelongsTo
29 | {
30 | return $this->belongsTo(RoomType::class, 'room_type_id', 'id');
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Models/RoomUser.php:
--------------------------------------------------------------------------------
1 | RoomUserRole::class,
12 | ];
13 | }
14 |
--------------------------------------------------------------------------------
/app/Models/ServerStat.php:
--------------------------------------------------------------------------------
1 | 'integer',
11 | 'listener_count' => 'integer',
12 | 'voice_participant_count' => 'integer',
13 | 'video_count' => 'integer',
14 | 'meeting_count' => 'integer',
15 | ];
16 |
17 | /**
18 | * Server the statistical data belongs to
19 | *
20 | * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
21 | */
22 | public function server()
23 | {
24 | return $this->belongsTo(Server::class);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Models/Session.php:
--------------------------------------------------------------------------------
1 | 'datetime',
17 | ];
18 |
19 | protected $dateFormat = 'U';
20 |
21 | /**
22 | * User this session belongs to
23 | *
24 | * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
25 | */
26 | public function user()
27 | {
28 | return $this->belongsTo(User::class);
29 | }
30 |
31 | public function sessionData()
32 | {
33 | return $this->hasMany(SessionData::class);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/Models/SessionData.php:
--------------------------------------------------------------------------------
1 | belongsTo(Session::class);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/Models/VerifyEmail.php:
--------------------------------------------------------------------------------
1 | belongsTo(User::class);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/Plugins/Contracts/ServerLoadCalculationPluginContract.php:
--------------------------------------------------------------------------------
1 | can('meetings.viewAny');
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Providers/BroadcastServiceProvider.php:
--------------------------------------------------------------------------------
1 | app->singleton(Generator::class, function () {
18 | $faker = Factory::create();
19 | $faker->addProvider(new TextProvider($faker));
20 |
21 | return $faker;
22 | });
23 | }
24 |
25 | /**
26 | * Bootstrap services.
27 | */
28 | public function boot(): void
29 | {
30 | //
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Providers/HorizonServiceProvider.php:
--------------------------------------------------------------------------------
1 | can('system.monitor');
28 | });
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/Providers/TranslationServiceProvider.php:
--------------------------------------------------------------------------------
1 | app->singleton('translation.loader', function ($app) {
18 | return new FileLoader($app['files'], [config('app.default_locale_dir'), config('app.custom_locale_dir')]);
19 | });
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Rules/CustomCreateMeetingParameters.php:
--------------------------------------------------------------------------------
1 | verifyEmail = $verifyEmail;
16 | $this->plainTextToken = $plainTextToken;
17 | }
18 |
19 | public function getVerifyEmail(): VerifyEmail
20 | {
21 | return $this->verifyEmail;
22 | }
23 |
24 | public function getPlainTextToken(): string
25 | {
26 | return $this->plainTextToken;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/Services/StreamingServiceFactory.php:
--------------------------------------------------------------------------------
1 | add(Directive::BASE, Keyword::SELF)
16 | ->add(Directive::CONNECT, Keyword::SELF)
17 | ->add(Directive::DEFAULT, Keyword::SELF)
18 | ->add(Directive::FORM_ACTION, Keyword::SELF)
19 | ->add(Directive::IMG, ['*', 'data:', 'blob:'])
20 | ->add(Directive::MEDIA, Keyword::SELF)
21 | ->add(Directive::OBJECT, Keyword::NONE)
22 | ->add(Directive::STYLE, [Keyword::SELF, Keyword::UNSAFE_INLINE])
23 | ->addNonce(Directive::SCRIPT);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Support/LaravelViteNonceGenerator.php:
--------------------------------------------------------------------------------
1 | env('GREENLIGHT_COMPATIBILITY', false),
5 | 'base' => env('GREENLIGHT_PATH', 'b'),
6 | ];
7 |
--------------------------------------------------------------------------------
/config/permissions.php:
--------------------------------------------------------------------------------
1 | explode(',', env('PERMISSION_RESTRICTIONS', '')),
5 | ];
6 |
--------------------------------------------------------------------------------
/config/plugins.php:
--------------------------------------------------------------------------------
1 | explode(',', env('PLUGINS', '')),
5 | 'contracts' => [
6 | \App\Plugins\Contracts\ServerLoadCalculationPluginContract::class,
7 | ],
8 | 'namespaces' => [
9 | 'defaults' => 'App\Plugins\Defaults',
10 | 'custom' => 'App\Plugins\Custom',
11 | ],
12 | ];
13 |
--------------------------------------------------------------------------------
/config/recording.php:
--------------------------------------------------------------------------------
1 | env('RECORDING_PLAYER', '/playback/presentation/2.3'),
5 | 'spool-sub-directory' => env('RECORDING_SPOOL_SUB_DIRECTORY', ''),
6 | 'download_allowlist' => env('RECORDING_DOWNLOAD_ALLOWLIST', '.*'),
7 | 'max_retention_period' => (int) env('RECORDING_MAX_RETENTION_PERIOD', -1),
8 | 'description_limit' => (int) env('RECORDING_DESCRIPTION_LIMIT', 1000),
9 | 'import_before_hook' => env('RECORDING_IMPORT_BEFORE_HOOK', ''),
10 | ];
11 |
--------------------------------------------------------------------------------
/config/streaming.php:
--------------------------------------------------------------------------------
1 | (bool) env('STREAMING_ENABLED', false),
5 | 'api' => env('STREAMING_API'),
6 | 'server_timeout' => (int) env('STREAMING_SERVER_TIMEOUT', 10),
7 | 'server_connect_timeout' => (int) env('STREAMING_SERVER_CONNECT_TIMEOUT', 20),
8 | 'refresh_interval' => (int) env('STREAMING_REFRESH_INTERVAL', 10),
9 | 'show_fps' => (bool) env('STREAMING_SHOW_FPS', false),
10 | 'auth' => [
11 | 'type' => env('STREAMING_AUTH_TYPE', 'none'),
12 | 'basic' => [
13 | 'username' => env('STREAMING_AUTH_BASIC_USERNAME'),
14 | 'password' => env('STREAMING_AUTH_BASIC_PASSWORD'),
15 | ],
16 | ],
17 | ];
18 |
--------------------------------------------------------------------------------
/database/.gitignore:
--------------------------------------------------------------------------------
1 | *.sqlite*
2 |
--------------------------------------------------------------------------------
/database/factories/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/database/factories/.gitkeep
--------------------------------------------------------------------------------
/database/factories/PermissionFactory.php:
--------------------------------------------------------------------------------
1 | $this->faker->unique()->word,
26 | ];
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/database/factories/RecordingFactory.php:
--------------------------------------------------------------------------------
1 | faker->numberBetween(1, 20000);
17 | $end = $this->faker->date('U');
18 |
19 | return [
20 | 'id' => $this->faker->uuid,
21 | 'room_id' => Room::factory(),
22 | 'description' => $this->faker->text,
23 | 'access' => RecordingAccess::OWNER,
24 | 'start' => date('Y-m-d H:i:s', $end - $length),
25 | 'end' => date('Y-m-d H:i:s', $end),
26 | ];
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/database/factories/RoleFactory.php:
--------------------------------------------------------------------------------
1 | $this->faker->unique()->word,
26 | 'superuser' => false,
27 | ];
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/database/factories/RoomTokenFactory.php:
--------------------------------------------------------------------------------
1 | $this->faker->firstName,
28 | 'lastname' => $this->faker->lastName,
29 | 'role' => RoomUserRole::USER,
30 | 'room_id' => Room::factory(),
31 | ];
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/database/factories/RoomTypeFactory.php:
--------------------------------------------------------------------------------
1 | $this->faker->word,
27 | 'color' => $this->faker->hexColor,
28 | 'server_pool_id' => ServerPool::factory(),
29 | ];
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/database/factories/ServerPoolFactory.php:
--------------------------------------------------------------------------------
1 | $this->faker->unique()->word,
26 | 'description' => $this->faker->text,
27 | ];
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/database/migrations/2014_10_12_100000_create_password_resets_table.php:
--------------------------------------------------------------------------------
1 | string('email')->index();
18 | $table->string('token');
19 | $table->timestamp('created_at')->nullable();
20 | });
21 | }
22 |
23 | /**
24 | * Reverse the migrations.
25 | *
26 | * @return void
27 | */
28 | public function down()
29 | {
30 | Schema::dropIfExists('password_resets');
31 | }
32 | };
33 |
--------------------------------------------------------------------------------
/database/migrations/2022_07_21_000003_create_permissions_table.php:
--------------------------------------------------------------------------------
1 | id();
18 | $table->string('name')->unique();
19 | $table->timestamps();
20 | });
21 | }
22 |
23 | /**
24 | * Reverse the migrations.
25 | *
26 | * @return void
27 | */
28 | public function down()
29 | {
30 | Schema::dropIfExists('permissions');
31 | }
32 | };
33 |
--------------------------------------------------------------------------------
/database/migrations/2022_07_21_000009_create_server_server_pool_table.php:
--------------------------------------------------------------------------------
1 | foreignId('server_id')->constrained()->onDelete('cascade');
14 | $table->foreignId('server_pool_id')->constrained()->onDelete('cascade');
15 | });
16 | $seeder = new ServerPoolSeeder;
17 | $seeder->run();
18 | }
19 |
20 | public function down()
21 | {
22 | Schema::dropIfExists('server_server_pool');
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/database/migrations/2022_09_29_101046_create_verify_emails_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('user_id')->constrained()->onDelete('cascade');
14 | $table->string('email');
15 | $table->string('token');
16 | $table->timestamps();
17 | });
18 | }
19 |
20 | public function down()
21 | {
22 | Schema::dropIfExists('verify_emails');
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/database/migrations/2023_04_14_083707_create_settings_table.php:
--------------------------------------------------------------------------------
1 | id();
13 |
14 | $table->string('group');
15 | $table->string('name');
16 | $table->boolean('locked')->default(false);
17 | $table->json('payload');
18 |
19 | $table->timestamps();
20 |
21 | $table->unique(['group', 'name']);
22 | });
23 | }
24 |
25 | public function down()
26 | {
27 | Schema::dropIfExists('settings');
28 | }
29 | };
30 |
--------------------------------------------------------------------------------
/database/migrations/2024_05_22_101114_add_create_parameters_to_room_types_table.php:
--------------------------------------------------------------------------------
1 | text('create_parameters')->nullable();
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('room_types', function (Blueprint $table) {
25 | $table->dropColumn('create_parameters');
26 |
27 | });
28 | }
29 | };
30 |
--------------------------------------------------------------------------------
/database/migrations/2024_12_19_103013_make_server_name_unique.php:
--------------------------------------------------------------------------------
1 | unique('name');
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('servers', function (Blueprint $table) {
25 | $table->dropUnique(['name']);
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/2025_03_31_130245_add_external_image_hash_to_users_table.php:
--------------------------------------------------------------------------------
1 | string('external_image_hash')->nullable()->after('image');
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('users', function (Blueprint $table) {
25 | $table->dropColumn('external_image_hash');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/2025_05_20_092623_add_last_login_to_users_table.php:
--------------------------------------------------------------------------------
1 | dateTime('last_login')->nullable();
13 | });
14 | }
15 |
16 | public function down(): void
17 | {
18 | Schema::table('users', function (Blueprint $table) {
19 | $table->dropColumn('last_login');
20 | });
21 | }
22 | };
23 |
--------------------------------------------------------------------------------
/database/migrations/2025_05_20_153825_add_join_parameters_to_room_types_table.php:
--------------------------------------------------------------------------------
1 | text('join_parameters')->nullable();
13 | });
14 | }
15 |
16 | public function down(): void
17 | {
18 | Schema::table('room_types', function (Blueprint $table) {
19 | $table->dropColumn('join_parameters');
20 | });
21 | }
22 | };
23 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2023_07_31_143604_add_short_description_to_rooms_table.php:
--------------------------------------------------------------------------------
1 | string('short_description', 300)->nullable();
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('rooms', function (Blueprint $table) {
25 | $table->dropColumn('short_description');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2023_11_24_135054_remove_short_from_room_types.php:
--------------------------------------------------------------------------------
1 | dropColumn('short');
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('room_types', function (Blueprint $table) {
25 | $table->string('short', 2)->nullable();
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2024_01_31_070902_add_require_access_code_to_room_types_table.php:
--------------------------------------------------------------------------------
1 | boolean('require_access_code')->default(false);
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('room_types', function (Blueprint $table) {
25 | $table->dropColumn('require_access_code');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2024_01_31_071243_add_allow_record_attendace_to_room_types_table.php:
--------------------------------------------------------------------------------
1 | boolean('allow_record_attendance')->default(true);
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('room_types', function (Blueprint $table) {
25 | $table->dropColumn('allow_record_attendance');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2024_02_29_091745_rename_columns_in_roles_table.php:
--------------------------------------------------------------------------------
1 | renameColumn('default', 'superuser');
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('roles', function (Blueprint $table) {
25 | $table->renameColumn('superuser', 'default');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2024_03_07_085720_add_disconnected_to_meetings_table.php:
--------------------------------------------------------------------------------
1 | dateTime('detached')->nullable();
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('meetings', function (Blueprint $table) {
25 | $table->dropColumn('detached');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2024_03_10_095259_add_description_to_room_types_table.php:
--------------------------------------------------------------------------------
1 | string('description', 5000)->nullable();
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('room_types', function (Blueprint $table) {
25 | $table->dropColumn('description');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/migrate-to-v4/2024_04_25_064827_add_record_to_meetings.php:
--------------------------------------------------------------------------------
1 | boolean('record')->default(false);
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('meetings', function (Blueprint $table) {
25 | $table->dropColumn('record');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/v2/2014_10_12_100000_create_password_resets_table.php:
--------------------------------------------------------------------------------
1 | string('email')->index();
18 | $table->string('token');
19 | $table->timestamp('created_at')->nullable();
20 | });
21 | }
22 |
23 | /**
24 | * Reverse the migrations.
25 | *
26 | * @return void
27 | */
28 | public function down()
29 | {
30 | Schema::dropIfExists('password_resets');
31 | }
32 | };
33 |
--------------------------------------------------------------------------------
/database/migrations/v2/2022_07_21_000003_create_permissions_table.php:
--------------------------------------------------------------------------------
1 | id();
18 | $table->string('name')->unique();
19 | $table->timestamps();
20 | });
21 | }
22 |
23 | /**
24 | * Reverse the migrations.
25 | *
26 | * @return void
27 | */
28 | public function down()
29 | {
30 | Schema::dropIfExists('permissions');
31 | }
32 | };
33 |
--------------------------------------------------------------------------------
/database/migrations/v2/2022_07_21_000006_create_settings_table.php:
--------------------------------------------------------------------------------
1 | increments('id');
17 | $table->string('key')->index();
18 | $table->text('value');
19 | });
20 | }
21 |
22 | /**
23 | * Reverse the migrations.
24 | *
25 | * @return void
26 | */
27 | public function down()
28 | {
29 | Schema::drop('settings');
30 | }
31 | };
32 |
--------------------------------------------------------------------------------
/database/migrations/v2/2022_07_21_000009_create_server_server_pool_table.php:
--------------------------------------------------------------------------------
1 | foreignId('server_id')->constrained()->onDelete('cascade');
14 | $table->foreignId('server_pool_id')->constrained()->onDelete('cascade');
15 | });
16 | $seeder = new ServerPoolSeeder;
17 | $seeder->run();
18 | }
19 |
20 | public function down()
21 | {
22 | Schema::dropIfExists('server_server_pool');
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/database/migrations/v2/2022_09_23_144227_add_description_to_rooms_table.php:
--------------------------------------------------------------------------------
1 | text('description')->nullable();
13 | });
14 | }
15 |
16 | public function down()
17 | {
18 | Schema::table('rooms', function (Blueprint $table) {
19 | $table->dropColumn('description');
20 | });
21 | }
22 | };
23 |
--------------------------------------------------------------------------------
/database/migrations/v2/2022_09_29_101046_create_verify_emails_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('user_id')->constrained()->onDelete('cascade');
14 | $table->string('email');
15 | $table->string('token');
16 | $table->timestamps();
17 | });
18 | }
19 |
20 | public function down()
21 | {
22 | Schema::dropIfExists('verify_emails');
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/database/migrations/v2/2023_09_01_100006_revert_authenticator_bundling.php:
--------------------------------------------------------------------------------
1 | update(['authenticator' => 'ldap']);
14 | }
15 |
16 | /**
17 | * Reverse the migrations.
18 | */
19 | public function down(): void
20 | {
21 | User::where('authenticator', 'ldap')->update(['authenticator' => 'external']);
22 | }
23 | };
24 |
--------------------------------------------------------------------------------
/database/migrations/v2/2023_09_28_084531_rename_salt_to_secret_in_servers_table.php:
--------------------------------------------------------------------------------
1 | renameColumn('salt', 'secret');
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('servers', function (Blueprint $table) {
25 | $table->renameColumn('secret', 'salt');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/seeders/DatabaseSeeder.php:
--------------------------------------------------------------------------------
1 | call(RoomTypeSeeder::class);
17 | $this->call(RolesAndPermissionsSeeder::class);
18 | $this->call(ServerPoolSeeder::class);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/database/seeders/Demo/storage/abc-def-123/anatomy-foot.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/database/seeders/Demo/storage/abc-def-123/anatomy-foot.pdf
--------------------------------------------------------------------------------
/database/seeders/Demo/storage/abc-def-123/anatomy-introduction.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/database/seeders/Demo/storage/abc-def-123/anatomy-introduction.pdf
--------------------------------------------------------------------------------
/database/seeders/Demo/storage/public/profile_images/angela-jones.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/database/seeders/Demo/storage/public/profile_images/angela-jones.jpg
--------------------------------------------------------------------------------
/database/seeders/Demo/storage/public/profile_images/daniel-osorio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/database/seeders/Demo/storage/public/profile_images/daniel-osorio.jpg
--------------------------------------------------------------------------------
/database/seeders/Demo/storage/public/profile_images/john-doe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/THM-Health/PILOS/7ace1347300f486c0ce82903c0c5e46324b33f8d/database/seeders/Demo/storage/public/profile_images/john-doe.jpg
--------------------------------------------------------------------------------
/database/seeders/ServerPoolSeeder.php:
--------------------------------------------------------------------------------
1 | count() == 0) {
20 | $default = ServerPool::create(['name' => 'Default', 'description' => '']);
21 | $default->servers()->sync(Server::all());
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/database/settings/2023_04_14_103520_create_user_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('user.password_change_allowed', true);
10 | }
11 |
12 | public function down(): void
13 | {
14 | $this->migrator->delete('user.password_change_allowed');
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/database/settings/2023_04_14_103858_create_big_blue_button_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('bbb.logo');
10 | $this->migrator->add('bbb.style');
11 | $this->migrator->add('bbb.default_presentation');
12 | }
13 |
14 | public function down(): void
15 | {
16 | $this->migrator->delete('bbb.logo');
17 | $this->migrator->delete('bbb.style');
18 | $this->migrator->delete('bbb.default_presentation');
19 | }
20 | };
21 |
--------------------------------------------------------------------------------
/database/settings/2024_05_24_135649_add_toast_life_time_to_general_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('general.toast_lifetime', 5);
10 | }
11 |
12 | public function down(): void
13 | {
14 | $this->migrator->delete('general.toast_lifetime');
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/database/settings/2024_07_09_122330_add_theme_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('theme.primary_color', '#14b8a6');
10 | $this->migrator->add('theme.rounded', true);
11 | }
12 |
13 | public function down(): void
14 | {
15 | $this->migrator->delete('theme.primary_color');
16 | $this->migrator->delete('theme.rounded');
17 | }
18 | };
19 |
--------------------------------------------------------------------------------
/database/settings/2024_09_27_065358_add_file_terms_of_use_to_room_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('room.file_terms_of_use');
10 | }
11 |
12 | public function down(): void
13 | {
14 | $this->migrator->delete('room.file_terms_of_use');
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/database/settings/2024_09_27_101218_add_no_welcome_page_to_general_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('general.no_welcome_page', false);
10 | }
11 |
12 | public function down(): void
13 | {
14 | $this->migrator->delete('general.no_welcome_page');
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/database/settings/2024_11_26_131704_create_streaming_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('streaming.default_pause_image');
10 | $this->migrator->add('streaming.css_file');
11 | $this->migrator->add('streaming.join_parameters');
12 | }
13 |
14 | public function down(): void
15 | {
16 | $this->migrator->delete('streaming.default_pause_image');
17 | $this->migrator->delete('streaming.css_file');
18 | $this->migrator->delete('streaming.join_parameters');
19 | }
20 | };
21 |
--------------------------------------------------------------------------------
/database/settings/2024_12_13_133315_add_dark_mode_logo_to_big_blue_button_settings.php:
--------------------------------------------------------------------------------
1 | migrator->add('bbb.logo_dark');
10 | }
11 |
12 | public function down(): void
13 | {
14 | $this->migrator->delete('bbb.logo_dark');
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/database/settings/2025_01_09_135151_fix_invalid_link_button_style.php:
--------------------------------------------------------------------------------
1 | migrator->update(
11 | 'banner.link_style',
12 | function (LinkButtonStyle $style) {
13 | return LinkButtonStyle::getDeprecationReplacement($style);
14 | }
15 | );
16 | }
17 | };
18 |
--------------------------------------------------------------------------------
/docker/app/cron/scheduler:
--------------------------------------------------------------------------------
1 | SHELL=/bin/sh
2 | PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
3 |
4 | # m h dom mon dow user command
5 | * * * * * cd /var/www/html/ && pilos-cli schedule:run --verbose --no-interaction > /proc/1/fd/1 2>/proc/1/fd/2
6 |
--------------------------------------------------------------------------------
/docker/app/ldap/ldap.conf:
--------------------------------------------------------------------------------
1 | TLS_REQCERT never
2 |
--------------------------------------------------------------------------------
/docker/app/nginx/snippets-available/ssl:
--------------------------------------------------------------------------------
1 |
2 | listen 443 ssl;
3 |
4 | ssl_certificate /local/certs/fullchain.pem;
5 | ssl_certificate_key /local/certs/privkey.pem;
6 | ssl_session_timeout 1d;
7 | ssl_session_cache shared:MozSSL:10m;
8 | ssl_session_tickets off;
9 | ssl_protocols TLSv1.2 TLSv1.3;
10 | ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
11 | ssl_prefer_server_ciphers off;
12 |
--------------------------------------------------------------------------------
/docker/app/php/opcache.ini:
--------------------------------------------------------------------------------
1 | [opcache]
2 | opcache.enable=1
3 | opcache.memory_consumption=512
4 | opcache.interned_strings_buffer=64
5 | opcache.max_accelerated_files=32531
6 | opcache.save_comments=1
7 | opcache.fast_shutdown=0
8 | opcache.enable_cli=1
9 | opcache.validate_timestamps=1
10 |
--------------------------------------------------------------------------------
/docker/app/php/php.ini:
--------------------------------------------------------------------------------
1 | [PHP]
2 | post_max_size = 1G
3 | upload_max_filesize = 1G
4 | variables_order = EGPCS
5 |
--------------------------------------------------------------------------------
/docker/openldap/acl.ldif:
--------------------------------------------------------------------------------
1 | dn: olcDatabase={1}{{ LDAP_BACKEND }},cn=config
2 | changetype: modify
3 | delete: olcAccess
4 | -
5 | add: olcAccess
6 | olcAccess: to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break
7 | olcAccess: to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,{{ LDAP_BASE_DN }}" write by anonymous auth by * none
8 | olcAccess: to * by self read by dn="cn=admin,{{ LDAP_BASE_DN }}" write by users read by * none
9 |
--------------------------------------------------------------------------------
/docs/.gitignore:
--------------------------------------------------------------------------------
1 | # Dependencies
2 | /node_modules
3 |
4 | # Production
5 | /build
6 |
7 | # Generated files
8 | .docusaurus
9 | .cache-loader
10 |
11 | # Misc
12 | .DS_Store
13 | .env.local
14 | .env.development.local
15 | .env.test.local
16 | .env.production.local
17 |
18 | npm-debug.log*
19 | yarn-debug.log*
20 | yarn-error.log*
21 |
--------------------------------------------------------------------------------
/docs/docs/administration/08-advanced/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 | "label": "Advanced",
3 | "link": {
4 | "type": "generated-index"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/docs/docs/administration/09-customisation/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Customisation
3 | ---
4 |
5 | import DocCardList from '@theme/DocCardList';
6 |
7 |
13 |
14 | {{ error }}
15 | {{ $t("app.error") }} {{ $t("app.not_found") }}
16 |
17 |
3 | {{ $t("home.title.first_line.before_flip_words")
4 | }}
13 |
14 |
--------------------------------------------------------------------------------
/resources/js/components/LoadingRetryButton.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
7 | {{ $t("home.title.second_line.before_underline")
8 | }}{{ props.title }}
4 |
12 | {{ $t("app.profile") }}
7 |
8 |