env('DEMO_MODE', false), /* |-------------------------------------------------------------------------- | Blocked Routes |-------------------------------------------------------------------------- | | Route names, matched with Str::is() so a trailing * covers a whole | domain. Only writes are considered, so "settings.*" refuses saving the | settings without hiding the settings pages themselves. GET routes that | change state belong under "unsafe_reads" below. | | A slash separated entry is matched against the request path instead, | which is how the largely unnamed routes in routes/api.php are covered. | */ 'blocked' => [ // Settings are global. One visitor renaming the application or // turning registration off breaks the demo for everybody else. 'settings.*', // The role and permission matrix rewrites what every role may do, // including the role the demo account itself belongs to. 'permissions.save', // The installer rewrites .env and re-runs the seeders. 'install.*', // Two factor authentication on a shared account locks out every // other visitor. '2fa.*', 'user.two-factor.*', 'two-factor.enable', 'two-factor.disable', 'two-factor.confirm', 'two-factor.regenerate-recovery-codes', // The same three concerns over the API, which is unnamed and so has // to be matched by path. 'api/me/2fa', 'api/me/2fa/*', 'api/users/*/2fa', 'api/users/*/2fa/*', 'api/roles/*/permissions', // Announcements are visible to every visitor. Uncomment these if // moderating them becomes a chore. The guard is a global middleware, // so plugin routes are covered without touching the plugin. // 'announcements.store', // 'announcements.update', // 'announcements.destroy', ], /* |-------------------------------------------------------------------------- | Unsafe Reads |-------------------------------------------------------------------------- | | GET routes that change state, and so are refused despite the verb. | Everything else answering a safe verb is left alone, because a demo that | cannot be browsed is not a demo. | | Impersonation is deliberately absent: it is one of the features the demo | exists to show off, and it grants nothing. The rules below follow the | impersonated identity, so a visitor who takes over a protected account | still cannot modify it. | */ 'unsafe_reads' => [ // The same controller action as the POST, reachable over GET. 'install.installation.start', ], /* |-------------------------------------------------------------------------- | Allowed Routes |-------------------------------------------------------------------------- | | Checked before everything else, so these win over "blocked". This is | what a visitor needs in order to use the demo at all. | */ 'allowed' => [ 'login', 'logout', 'auth.logout', 'register', 'password.email', 'password.update', 'verification.resend', // The two factor challenge at login, as opposed to enabling two // factor authentication on an account. 'auth.token.validate', 'two-factor.login.store', // Confirms the current password, it does not change it. 'password.confirm.store', 'announcements.read', ], /* |-------------------------------------------------------------------------- | Protected Accounts |-------------------------------------------------------------------------- | | Usernames or email addresses of the shared accounts the demo hands out. | They cannot be renamed, re-passworded, re-avatared, approved, deleted or | have their sessions invalidated, whether the request targets them or is | made by them. Matched case insensitively. | | UserSeeder creates exactly one: admin / admin@example.com. | */ 'protected_users' => ['admin'], /* |-------------------------------------------------------------------------- | Self Service Routes |-------------------------------------------------------------------------- | | The routes where the signed in user is the thing being modified. Only | these consult the acting user, so a visitor on the shared account can | still create users, roles and permissions. | */ 'self_routes' => [ 'profile.update.*', 'profile.sessions.*', // The API equivalents, matched by path because they are unnamed. 'api/me/*', 'api/sessions/*', ], /* |-------------------------------------------------------------------------- | Default Roles And Permissions |-------------------------------------------------------------------------- | | Extends the existing "removable" column from delete to update, so the | seeded roles and permissions cannot be renamed either. | */ 'protect_default_roles' => true, /* |-------------------------------------------------------------------------- | Message Override |-------------------------------------------------------------------------- | | One message in place of the translated defaults. Rendered as plain text | in a toast, so no markup. | */ 'message' => env('DEMO_MESSAGE'), ];