Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
292 commits
Select commit Hold shift + click to select a range
2c81447
Deps: Updated PHP deps via composer
ssddanbrown Oct 21, 2025
ebf8261
Code: Added groovy syntax highlighting
ssddanbrown Oct 21, 2025
abe9c1e
API Docs: Updated link to archived GitHub repo
ssddanbrown Oct 22, 2025
082dbc9
API: Started building comments API endpoints
ssddanbrown Oct 22, 2025
3ad1e31
API: Added comment-read endpoint, added api docs section descriptions
ssddanbrown Oct 22, 2025
cbf27d7
API: Added comment CUD endpoints, drafted tests
ssddanbrown Oct 23, 2025
fcacf7c
API: Built out tests for comment API endpoints
ssddanbrown Oct 23, 2025
4627dfd
API: Added comment tree to pages-read endpoint
ssddanbrown Oct 24, 2025
9c4a922
Comments API: Addressed failing tests and static testing
ssddanbrown Oct 24, 2025
a949900
API: Added examples for comments
ssddanbrown Oct 24, 2025
c21c36e
Merge pull request #5850 from BookStackApp/comments_api
ssddanbrown Oct 24, 2025
0b26573
Search: Started work to make search result size consistent
ssddanbrown Oct 27, 2025
f0303de
Search: Improved result hydration performance
ssddanbrown Oct 27, 2025
3fd25bd
Search: Added pagination, updated other search uses
ssddanbrown Oct 28, 2025
751934c
Search: Tested changes to single-table search
ssddanbrown Oct 29, 2025
652124a
Merge pull request #5854 from BookStackApp/efficient_search
ssddanbrown Oct 29, 2025
02d024a
API: Added endpoints for reading image data
ssddanbrown Oct 29, 2025
570ded1
Set cursor to pointer for drawio diagrams
lublak Oct 31, 2025
7881bdd
Merge pull request #5860 from BookStackApp/api_image_data_endpoint
ssddanbrown Oct 31, 2025
1df850e
Search: Fixed formatting timeout with many term occurrences
ssddanbrown Oct 31, 2025
4a57933
Deps: Updated PHP composer packages
ssddanbrown Nov 2, 2025
d40a68b
API: Re-ordered routes, Improved navigation
ssddanbrown Nov 2, 2025
563828b
Updated translations with latest Crowdin changes (#5843)
ssddanbrown Nov 2, 2025
1421ba8
Updated translator & dependency attribution before release v25.11
ssddanbrown Nov 9, 2025
5bf2d80
Notifications: Fixed attempted null usage issue where int expected
ssddanbrown Nov 9, 2025
8de2c28
Merge branch 'development' into release
ssddanbrown Nov 9, 2025
fcabf47
Updated version and assets for release v25.11
ssddanbrown Nov 9, 2025
4eb4407
DB: Updated entity scope to use models dynamic table
ssddanbrown Nov 10, 2025
befc645
DB: Added initial DB testing docker-based script
ssddanbrown Nov 11, 2025
8ab9252
DB: Added extra query tests, updated db-testing scripts
ssddanbrown Nov 11, 2025
8082c95
Merge branch 'development' into release
ssddanbrown Nov 11, 2025
fef61f0
Updated version and assets for release v25.11.1
ssddanbrown Nov 11, 2025
aaa2818
Exports: Updated perm checking for images in ZIP exports
ssddanbrown Nov 18, 2025
f06a6de
Merge pull request #5899 from BookStackApp/zip_image_handling
ssddanbrown Nov 18, 2025
99a1d82
Deps: Updated PHP package versions
ssddanbrown Nov 18, 2025
1be2969
Dev: Set timezone for test DB creation, added PHP 8.5 to tests
ssddanbrown Nov 18, 2025
b2f81f5
New translations common.php (Albanian) (#5887)
ssddanbrown Nov 19, 2025
47f12cc
Maintenance: Fixed type issue, updated translator list
ssddanbrown Nov 19, 2025
8429cc9
Merge branch 'development' into release
ssddanbrown Nov 19, 2025
bbda5fd
Updated version and assets for release v25.11.2
ssddanbrown Nov 19, 2025
73c6bf4
Images: Updated access to consider public secure_restricted
ssddanbrown Nov 21, 2025
9934f85
Deps: Updated PHP packages via composer
ssddanbrown Nov 21, 2025
22a7772
Env: Added storage type to default example env
ssddanbrown Nov 21, 2025
cca066a
Merge branch 'development' into release
ssddanbrown Nov 21, 2025
ad8fc95
Updated version and assets for release v25.11.3
ssddanbrown Nov 21, 2025
870f3c5
DB Testing: Updated supported DB list, added readme
ssddanbrown Nov 22, 2025
ad582ab
DB testing: Prevented caching during build
ssddanbrown Nov 22, 2025
e64fc60
Slugs: Created history table to track changes
ssddanbrown Nov 23, 2025
291a807
Slugs: Added slug recording at points of generation
ssddanbrown Nov 23, 2025
dd5375f
Slugs: Fixed storage bugs, added testing coverage
ssddanbrown Nov 24, 2025
dd39369
Slugs: Added lookup system using history
ssddanbrown Nov 24, 2025
c908169
Slugs: Rolled out history lookup to other types
ssddanbrown Nov 24, 2025
cdd164e
Slugs: Added test to cover history lookup permission usage
ssddanbrown Nov 24, 2025
0f40aeb
Merge pull request #5913 from BookStackApp/slug_history
ssddanbrown Nov 24, 2025
f073994
Testing: Extracted copy tests to their own class
ssddanbrown Nov 25, 2025
ba675b6
Copying: Added tests to cover copy self-references
ssddanbrown Nov 25, 2025
674bb84
Copying: Added reference change context tracking
ssddanbrown Nov 25, 2025
959981a
Copying: Added logic to find & update references
ssddanbrown Nov 25, 2025
98a09bc
Deps: Updated PHP packages
ssddanbrown Nov 25, 2025
9de2943
Notifications: Fixed error on comment notification
ssddanbrown Nov 25, 2025
bb7fd59
Merge branch 'v25-11' into release
ssddanbrown Nov 25, 2025
8dd238c
Updated version and assets for release v24.11.4
ssddanbrown Nov 25, 2025
46001d6
Updated version and assets for release v25.11.4
ssddanbrown Nov 25, 2025
bb35063
Styles: Made non-active dark/light css variables exist by default
ssddanbrown Nov 27, 2025
3cd3e73
Copying: Fixed issue with non-page links to page permalinks
ssddanbrown Nov 29, 2025
cf84797
Merge pull request #5917 from BookStackApp/copy_references
ssddanbrown Nov 29, 2025
9e8088f
JS: Bumped up JS package versions, and node version
ssddanbrown Nov 30, 2025
9d732d8
Lexical: Started dev API outline
ssddanbrown Nov 30, 2025
75231d2
Sponsors: Added Admin Intelligence
ssddanbrown Dec 2, 2025
21730ae
Sponsors: Tweaked logo sizing
ssddanbrown Dec 2, 2025
adfac3e
OIDC: Updated state handling to prevent loss from other requests
ssddanbrown Dec 3, 2025
2fde803
Deps: Updated PHP package versions
ssddanbrown Dec 3, 2025
65f7b61
Sessions: Ignored extra meta/dist content in history tracking
ssddanbrown Dec 3, 2025
93bcbd1
Merge branch 'v25-11' into release
ssddanbrown Dec 3, 2025
1611027
Updated version and assets for release v25.11.5
ssddanbrown Dec 3, 2025
ebceba0
Lexical API: Started working on docs format and jest testing
ssddanbrown Dec 4, 2025
dfdcfcf
Lexical API: Added content module, testing and documented
ssddanbrown Dec 5, 2025
8890746
Lexical API: Added public event to access editor API
ssddanbrown Dec 5, 2025
ab4b1c8
Lexical API: Reviewed docs, Made toolbar its own UI class
ssddanbrown Dec 5, 2025
b5246a2
Lexical API: Updated docs to align method format
ssddanbrown Dec 6, 2025
92a3c22
Merge pull request #5928 from BookStackApp/lexical_dev_api
ssddanbrown Dec 6, 2025
9886bbd
Merge branch 'feature/pagination_settings' of github.com:Xenoamor/Boo…
ssddanbrown Dec 6, 2025
10f5cee
List page settings: Review of #5606
ssddanbrown Dec 6, 2025
34e7471
Testing: Fixed some incorrect test case names
ssddanbrown Dec 6, 2025
08e7ba7
Images: Made resize errors log with error detail
ssddanbrown Dec 7, 2025
1ee5711
Pagination: Fixed lack of responsiveness causing overflow
ssddanbrown Dec 7, 2025
6661ae8
Lexical: Improved focus control for popup modal forms
ssddanbrown Dec 7, 2025
3e1b058
Lexical: Fixed undefined entity selector value
ssddanbrown Dec 7, 2025
50540e2
Lexical: Created mention node, started mention service, split comment…
ssddanbrown Dec 8, 2025
9bf9ae9
Mentions: Added new endpoint, Built editor list display
ssddanbrown Dec 9, 2025
1d87b51
Deps: Updated PHP package versions
ssddanbrown Dec 9, 2025
313326b
Updated translator & dependency attribution before release v25.11.6
ssddanbrown Dec 9, 2025
ce70340
Merge branch 'v25-11' into release
ssddanbrown Dec 9, 2025
8fcd3b2
Updated version and assets for release v25.11.6
ssddanbrown Dec 9, 2025
1e768ce
Lexical: Changed mention to be a decorator node
ssddanbrown Dec 13, 2025
147ff00
JS: Swapped livereload lib for esbuild livereload setup
ssddanbrown Dec 14, 2025
e2f91c2
Comment Mentions: Added keyboard nav, worked on design
ssddanbrown Dec 14, 2025
221c6c7
Comment Mentions: Added core back-end logic
ssddanbrown Dec 15, 2025
9211062
Merge pull request #5919 from BookStackApp/v25-11
ssddanbrown Dec 17, 2025
4f76047
Merge branch 'development' into comment_mentions
ssddanbrown Dec 17, 2025
48cdaab
Comment Mentions: Added tests to cover back-end functionality
ssddanbrown Dec 17, 2025
3d9aba7
Mentions: Added coverage for mentions search endpoint
ssddanbrown Dec 17, 2025
4aeb571
Update "Microsoft URL Rewrite Module for IIS" download link
gerundt Dec 17, 2025
90fc02c
Esbuild & Mentions: Updated interaction stability and build system
ssddanbrown Dec 17, 2025
51f9b63
Comment Mentions: Fixed and tweaks during review of changes
ssddanbrown Dec 18, 2025
a941d1b
Comment mentions: Fixed CI and test scenarios
ssddanbrown Dec 18, 2025
a4c0556
Merge pull request #5952 from gerundt/iis-module-link
ssddanbrown Dec 19, 2025
48df2be
DB: Added views->viewable_type index
ssddanbrown Dec 19, 2025
2de3247
Deps: Updated PHP package versions
ssddanbrown Dec 19, 2025
0b48361
Search: Fixed pagination not considering sub-paths
ssddanbrown Dec 19, 2025
d87e8d0
Merge pull request #5939 from BookStackApp/lexical_fixes_2512
ssddanbrown Dec 20, 2025
d504b19
System CLI: Update to v0.4
ssddanbrown Dec 20, 2025
382f4db
Merge pull request #5956 from BookStackApp/system_cli_update_dec25
ssddanbrown Dec 20, 2025
8aec571
Mentions: Fixed some users not showing in mention selector
ssddanbrown Dec 21, 2025
8fc9a2a
Lexical API: Updated docs to reflect public event usage
ssddanbrown Dec 23, 2025
3336e0c
Deps: Updated PHP packages via composer
ssddanbrown Dec 24, 2025
d93354f
Updated licenses and translation attribution pre v25.12
ssddanbrown Dec 24, 2025
38d3697
Updated translations with latest Crowdin changes (#5933)
ssddanbrown Dec 24, 2025
114fa80
Merge branch 'development' into release
ssddanbrown Dec 24, 2025
7c3a4c7
Updated version and assets for release v25.12
ssddanbrown Dec 24, 2025
88d86df
ZIP Exports: Added limit to ZIP file size before extraction
ssddanbrown Dec 29, 2025
b08d1b3
Search: Set limits on the amount of search terms
ssddanbrown Dec 30, 2025
b0a8cb0
Merge pull request #5968 from BookStackApp/limits
ssddanbrown Dec 30, 2025
082befb
Updated PHP packages and translators pre v25.12.1
ssddanbrown Dec 30, 2025
ab436ed
Updated translations with latest Crowdin changes (#5962)
ssddanbrown Dec 30, 2025
07ec880
Testing: Updated search tests to consider new limits
ssddanbrown Dec 30, 2025
fcbae16
Merge branch 'development' into release
ssddanbrown Dec 30, 2025
805fd98
Updated version and assets for release v25.12.1
ssddanbrown Dec 30, 2025
5c4fc3d
fix: Docker: Add
shaoliang123456 Dec 30, 2025
018de5d
fix: Configure safe directory for git in dockerfile
shaoliang123456 Dec 31, 2025
e6b754f
Merge pull request #5969 from shaoliang123456/fix/git-safe-directory-…
ssddanbrown Jan 3, 2026
43eed16
Meta: Updated dev version, license year, crowdin config
ssddanbrown Jan 7, 2026
20db372
Merge branch 'development' of github.com:BookStackApp/BookStack into …
ssddanbrown Jan 7, 2026
da7bedd
Sponsors: Added Onyx
ssddanbrown Jan 13, 2026
19f02d9
Deps: Updated PHP package versions
ssddanbrown Jan 22, 2026
4dc443b
Updated translations with latest Crowdin changes (#5970)
ssddanbrown Jan 22, 2026
ff59bbd
Updated translator & dependency attribution before release v25.12.2
ssddanbrown Jan 24, 2026
90d011f
Merge branch 'development' into release
ssddanbrown Jan 24, 2026
ed4baed
Updated version and assets for release v25.12.2
ssddanbrown Jan 24, 2026
36649a6
Theme: Updated view registration to be dynamic
ssddanbrown Jan 26, 2026
c32b168
Theme: Added the ability to add views before/after existing ones
ssddanbrown Jan 26, 2026
9fcfc76
Theme: Added testing of registerViewToRender* functions
ssddanbrown Jan 27, 2026
1b17bb3
Theme: Changed how before/after views are registered
ssddanbrown Jan 27, 2026
6a63b38
API: Prevented non-GET requests when using cookie-based auth
ssddanbrown Jan 29, 2026
c77a0fd
Page Content: Added form elements to filtering
ssddanbrown Jan 29, 2026
3e5e88d
Deps: Updated PHP package versions via composer
ssddanbrown Jan 29, 2026
9f7d3b5
Updated translations with latest Crowdin changes (#5997)
ssddanbrown Jan 29, 2026
46dcc30
Updated translator & dependency attribution before release v25.12.3
ssddanbrown Jan 29, 2026
f0cf4bd
Merge branch 'development' into release
ssddanbrown Jan 29, 2026
7abc269
Updated version and assets for release v25.12.3
ssddanbrown Jan 29, 2026
4949520
Theme System: Added initial module implementations
ssddanbrown Feb 1, 2026
cd84074
Theme System: Split & organised tests, changed module version to string
ssddanbrown Feb 1, 2026
120ee38
Theme Modules: Added testing coverage
ssddanbrown Feb 1, 2026
aa0a8dd
Theme Modules: Added dev documentation
ssddanbrown Feb 2, 2026
45ae03c
Theme Modules: Added install helper command
ssddanbrown Feb 3, 2026
f7890c2
Theme Modules: Fixes and improvements after manual testing
ssddanbrown Feb 5, 2026
5038d12
Theme modules: Updated docs to cover ZIP format
ssddanbrown Feb 5, 2026
9d3d0a4
Theme Modules: Added testing coverage for install command
ssddanbrown Feb 5, 2026
a20438b
Theme System: Fixed theme view before/after issues
ssddanbrown Feb 7, 2026
984a731
Theme modules: Updated view includes to prevent caching conflicts
ssddanbrown Feb 8, 2026
057d7be
Views: Made index/show sidebars a lot more modular
ssddanbrown Feb 8, 2026
5e12b67
Merge pull request #5998 from BookStackApp/further_theme_development
ssddanbrown Feb 9, 2026
10ebe53
Page Content: Added more complex & configurable content filtering
ssddanbrown Feb 13, 2026
0f040fe
Content: Tuned HTML purifier for our use
ssddanbrown Feb 15, 2026
227027f
Content: Updated purifier and content caching
ssddanbrown Feb 15, 2026
035be66
Content: Updated tests and CSP usage of content script setting
ssddanbrown Feb 15, 2026
8a221f6
Content Filtering: Covered new config options and filters with tests
ssddanbrown Feb 16, 2026
50e8501
Content Filter: Added extra object filtering
ssddanbrown Feb 16, 2026
3fa1174
Content filtering: Updated config and readme attribution
ssddanbrown Feb 16, 2026
826b36c
Editors: Added HTML filtering in certain loading conditions
ssddanbrown Feb 16, 2026
5d547fc
Deps: Updated PHP packages
ssddanbrown Feb 17, 2026
e438376
Meta: Updated licenses and config wording
ssddanbrown Feb 17, 2026
9646339
Testing: Addressed failing tests and static checks
ssddanbrown Feb 17, 2026
299d3b3
Merge branch 'v25-12' into release
ssddanbrown Feb 17, 2026
f484fbc
Updated version and assets for release v25.12.4
ssddanbrown Feb 17, 2026
a2017ff
Caching: Altered purifier cache folder to be server-created
ssddanbrown Feb 17, 2026
e1de1f0
git: Added old purifier location to gitignore
ssddanbrown Feb 17, 2026
f54f507
Merge branch 'v25-12' into release
ssddanbrown Feb 17, 2026
ad540a0
Updated version and assets for release v25.12.5
ssddanbrown Feb 17, 2026
9d15c79
Deps: Updated PHP package versions
ssddanbrown Feb 18, 2026
a8d96fd
Content filter: Allowed custom diagram attribute in allow-list
ssddanbrown Feb 18, 2026
6854687
Merge branch 'v25-12' into release
ssddanbrown Feb 18, 2026
7528bc1
Updated version and assets for release v25.12.6
ssddanbrown Feb 18, 2026
8020451
Page Content: Better handling for empty content filtering
ssddanbrown Feb 19, 2026
664eb6d
Merge branch 'v25-12' into release
ssddanbrown Feb 19, 2026
1db1083
Updated version and assets for release v25.12.7
ssddanbrown Feb 19, 2026
8e99fc6
Books: On delete, redirect to shelf if in context
ssddanbrown Feb 20, 2026
229a99b
Descriptions: Improved empty field handling, reduces whitespace
ssddanbrown Feb 20, 2026
23f3f35
Readme: Updated sponsors
ssddanbrown Feb 21, 2026
1077a4e
Merge branch 'v25-12' into development
ssddanbrown Feb 21, 2026
c10b0fd
Merge branch 'patch-1' of github.com:lublak/BookStack into lublak-pat…
ssddanbrown Feb 21, 2026
6808292
Editors: Made drawings appear clickiable via cursor
ssddanbrown Feb 21, 2026
7aef0a4
Content: Updated filters to allow some required attributes
ssddanbrown Feb 23, 2026
9a12e3a
Book API: Added shelves list to show endpoint
ssddanbrown Feb 24, 2026
dd42b9b
Text: Updated per-page display limits description
ssddanbrown Feb 27, 2026
10c4653
Logical Theme: Added OIDC_AUTH_PRE_REDIRECT event
ssddanbrown Feb 27, 2026
25ed242
Deps: Updated PHP package versions
ssddanbrown Feb 27, 2026
50a7183
Merge branch 'v25-12' into release
ssddanbrown Feb 27, 2026
d9b9303
Updated version and assets for release v25.12.8
ssddanbrown Feb 27, 2026
ec3dd85
Mail: Set domain for EHLO based upon the APP_URL
ssddanbrown Feb 28, 2026
f2f76a3
Modules: Improved install command based on testing
ssddanbrown Mar 6, 2026
7d0237c
NPM Deps: Updated package versions
ssddanbrown Mar 6, 2026
d0d1bb9
Merge pull request #6035 from BookStackApp/v25-12
ssddanbrown Mar 6, 2026
27240be
Theme System: Added new page-content focused events
ssddanbrown Mar 6, 2026
151823b
Theme Modules: Added easier way to insert HTML head content
ssddanbrown Mar 8, 2026
6d64262
Revision Diffs: Added filtering post-diff render
ssddanbrown Mar 10, 2026
404e67a
Page Revisions: Added testing coverage to basic diffing
ssddanbrown Mar 10, 2026
6216c89
Packages: Updated PHP package versions
ssddanbrown Mar 10, 2026
6e7cc16
Preferences: Updated return redirect with better origin checks
ssddanbrown Mar 10, 2026
5f5fea7
Deps: Bumped PHP packages before release
ssddanbrown Mar 12, 2026
d335b49
Merge branch 'v25-12' into release
ssddanbrown Mar 12, 2026
446b4a7
Updated version and assets for release v25.12.9
ssddanbrown Mar 12, 2026
60a3b0c
API examples: Updated books-read to include shelf info
ssddanbrown Mar 12, 2026
f4c9d2b
Exports: Fixed scope of pages in chapter MD export
ssddanbrown Mar 13, 2026
49df478
Merge pull request #6057 from BookStackApp/v25-12
ssddanbrown Mar 15, 2026
7cbfd72
Merge pull request #6007 from BookStackApp/l10n_development
ssddanbrown Mar 15, 2026
362859a
Updated translator & dependency attribution before release v26.03
ssddanbrown Mar 15, 2026
4f18fea
Deps: Updated PHP deps pre v26.03 release
ssddanbrown Mar 15, 2026
89caab1
Merge branch 'development' into release
ssddanbrown Mar 15, 2026
33d2eee
Updated version and assets for release v26.03
ssddanbrown Mar 15, 2026
a9ffd3e
Responses: Added extra sanitization for download names
ssddanbrown Mar 16, 2026
8a59895
Merge branch 'sec_chapter_export' into development
ssddanbrown Mar 17, 2026
0120b47
Deps: Updated PHP deps pre v26.03.1
ssddanbrown Mar 17, 2026
ee4786f
Merge branch 'development' into release
ssddanbrown Mar 17, 2026
7111e08
Updated version and assets for release v26.03.1
ssddanbrown Mar 17, 2026
04dd9f8
Update PHP_CodeSniffer repository link
rodrigoprimo Mar 17, 2026
5763d26
Updated registration to use validated input instead of all
ssddanbrown Mar 19, 2026
fa1dc16
Update PHP_CodeSniffer repository link (#6060)
ssddanbrown Mar 21, 2026
a447561
WYSIWYG: Aligned double click to set label for details functionality
ssddanbrown Mar 22, 2026
5ebc1fe
Deps: Updated PHP package versions pre v26.03.2 release
ssddanbrown Mar 22, 2026
fd6867e
Updated translations with latest Crowdin changes (#6064)
ssddanbrown Mar 23, 2026
1763ac5
Meta: Updated translators pre v26.03.2 release
ssddanbrown Mar 23, 2026
25790fd
Merge branch 'sec_26_03_2' into development
ssddanbrown Mar 23, 2026
851aba2
Merge branch 'development' into release
ssddanbrown Mar 23, 2026
508cf0a
Updated version and assets for release v26.03.2
ssddanbrown Mar 23, 2026
b9d6507
Deps: Updated PHP package versions
ssddanbrown Apr 5, 2026
a7dd998
Updated translations with latest Crowdin changes (#6067)
ssddanbrown Apr 5, 2026
e033578
Updated translator & dependency attribution before release v26.03.3
ssddanbrown Apr 5, 2026
cb6c5d7
Merge branch 'development' into release
ssddanbrown Apr 5, 2026
82ef735
Updated version and assets for release v26.03.3
ssddanbrown Apr 5, 2026
fc220de
Search: Fixed exact saerch term negation causing no results
ssddanbrown Apr 29, 2026
99a7046
Deps: Updated PHP package versions
ssddanbrown Apr 29, 2026
fddeb90
Attachments: Added page access check to attachment delete
ssddanbrown Apr 29, 2026
cf64890
SSR: Hardened URL validator against a range of workarounds
ssddanbrown Apr 30, 2026
1656281
Merge branch 'v26-03' into release
ssddanbrown Apr 30, 2026
d1bde2f
Updated version and assets for release v26.03.4
ssddanbrown Apr 30, 2026
1b9ec75
Deps: Updated PHP package versions
ssddanbrown May 21, 2026
ef82119
MFA: Added verify attempt rate limiting
ssddanbrown May 21, 2026
66dcd1f
Merge branch 'v26-03' into release
ssddanbrown May 21, 2026
cfeb035
Updated version and assets for release v26.03.5
ssddanbrown May 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ DB_DATABASE=database_database
DB_USERNAME=database_username
DB_PASSWORD=database_user_password

# Storage system to use
# By default files are stored on the local filesystem, with images being placed in
# public web space so they can be efficiently served directly by the web-server.
# For other options with different security levels & considerations, refer to:
# https://www.bookstackapp.com/docs/admin/upload-config/
STORAGE_TYPE=local

# Mail system to use
# Can be 'smtp' or 'sendmail'
MAIL_DRIVER=smtp
Expand Down
25 changes: 22 additions & 3 deletions .env.example.complete
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,14 @@ APP_LANG=en
# APP_LANG will be used if such a header is not provided.
APP_AUTO_LANG_PUBLIC=true

# Application timezone
# Used where dates are displayed such as on exported content.
# Application timezones
# The first option is used to determine what timezone is used for date storage.
# Leaving that as "UTC" is advised.
# The second option is used to set the timezone which will be used for date
# formatting and display. This defaults to the "APP_TIMEZONE" value.
# Valid timezone values can be found here: https://www.php.net/manual/en/timezones.php
APP_TIMEZONE=UTC
APP_DISPLAY_TIMEZONE=UTC

# Application theme
# Used to specific a themes/<APP_THEME> folder where BookStack UI
Expand Down Expand Up @@ -347,10 +351,25 @@ EXPORT_PDF_COMMAND_TIMEOUT=15
# Only used if 'ALLOW_UNTRUSTED_SERVER_FETCHING=true' which disables security protections.
WKHTMLTOPDF=false

# Allow <script> tags in page content
# Allow JavaScript, and other potentiall dangerous content in page content.
# This also removes CSP-level JavaScript control.
# Note, if set to 'true' the page editor may still escape scripts.
# DEPRECATED: Use 'APP_CONTENT_FILTERING' instead as detailed below. Activiting this option
# effectively sets APP_CONTENT_FILTERING='' (No filtering)
ALLOW_CONTENT_SCRIPTS=false

# Control the behaviour of content filtering, primarily used for page content.
# This setting is a string of characters which represent different available filters:
# - j - Filter out JavaScript and unknown binary data based content
# - h - Filter out unexpected, and potentially dangerous, HTML elements
# - f - Filter out unexpected form elements
# - a - Run content through a more complex allowlist filter
# This defaults to using all filters, unless ALLOW_CONTENT_SCRIPTS is set to true in which case no filters are used.
# Note: These filters are a best-attempt and may not be 100% effective. They are typically a layer used in addition to other security measures.
# Note: The default value will always be the most-strict, so it's advised to leave this unset in your own configuration
# to ensure you are always using the full range of filters.
APP_CONTENT_FILTERING="jfha"

# Indicate if robots/crawlers should crawl your instance.
# Can be 'true', 'false' or 'null'.
# The behaviour of the default 'null' option will depend on the 'app-public' admin setting.
Expand Down
38 changes: 35 additions & 3 deletions .github/translators.txt
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ Alexander Predl (Harveyhase68) :: German
Rem (Rem9000) :: Dutch
Michał Stelmach (stelmach-web) :: Polish
arniom :: French
REMOVED_USER :: French; Dutch; Portuguese, Brazilian; Portuguese; Turkish;
REMOVED_USER :: French; German; Dutch; Portuguese, Brazilian; Portuguese; Turkish;
林祖年 (contagion) :: Chinese Traditional
Siamak Guodarzi (siamakgoudarzi88) :: Persian
Lis Maestrelo (lismtrl) :: Portuguese, Brazilian
Expand Down Expand Up @@ -222,7 +222,7 @@ SmokingCrop :: Dutch
Maciej Lebiest (Szwendacz) :: Polish
DiscordDigital :: German; German Informal
Gábor Marton (dodver) :: Hungarian
Jasell :: Swedish
Jakob Åsell (Jasell) :: Swedish
Ghost_chu (ghostchu) :: Chinese Simplified
Ravid Shachar (ravidshachar) :: Hebrew
Helga Guchshenskaya (guchshenskaya) :: Russian
Expand Down Expand Up @@ -444,7 +444,7 @@ Irjan Olsen (Irch) :: Norwegian Bokmal
Aleksandar Jovanovic (jovanoviczaleksandar) :: Serbian (Cyrillic)
Red (RedVortex) :: Hebrew
xgrug :: Chinese Simplified
HrCalmar :: Danish
Calle Calmar (HrCalmar) :: Danish
Avishay Rapp (AvishayRapp) :: Hebrew
matthias4217 :: French
Berke BOYLU2 (berkeboylu2) :: Turkish
Expand Down Expand Up @@ -505,3 +505,35 @@ Danilo dos Santos Barbosa (bozochegou) :: Portuguese, Brazilian
Chris (furesoft) :: German
Silvia Isern (eiendragon) :: Catalan
Dennis Kron Pedersen (ahjdp) :: Danish
iamwhoiamwhoami :: Swedish
Grogui :: French
MrCharlesIII :: Arabic
David Olsen (dawin) :: Danish
ltnzr :: French
Frank Holler (holler.frank) :: German; German Informal
Korab Arifi (korabidev) :: Albanian
Petr Husák (petrhusak) :: Czech
Bernardo Maia (bernardo.bmaia2) :: Portuguese, Brazilian
Amr (amr3k) :: Arabic
Tahsin Ahmed (tahsinahmed2012) :: Bengali
bojan_che :: Serbian (Cyrillic)
setiawan setiawan (culture.setiawan) :: Indonesian
Donald Mac Kenzie (kiuman) :: Norwegian Bokmal
Gabriel Silver (GabrielBSilver) :: Hebrew
Tomas Darius Davainis (Tomasdd) :: Lithuanian
CriedHero :: Chinese Simplified
Henrik (henrik2105) :: Norwegian Bokmal
FoW (fofwisdom) :: Korean
serinf-lauza :: French
Diyan Nikolaev (nikolaev.diyan) :: Bulgarian
Shadluk Avan (quldosh) :: Uzbek
Marci (MartonPoto) :: Hungarian
Michał Sadurski (wheeskeey) :: Polish
JanDziaslo :: Polish
Charllys Fernandes (CharllysFernandes) :: Portuguese, Brazilian
Ilgiz Zigangirov (inov8) :: Russian
Max Israelsson (Blezie) :: Swedish
Skiddybison5924 (chris-devel0per) :: German
Veyilla Nightwhisper (Veyilla) :: German
João Barbosa (hypeedd) :: Portuguese
Abcdefg Hijklmn (collatek) :: Korean
2 changes: 1 addition & 1 deletion .github/workflows/test-migrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-24.04
strategy:
matrix:
php: ['8.2', '8.3', '8.4']
php: ['8.2', '8.3', '8.4', '8.5']
steps:
- uses: actions/checkout@v4

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-php.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-24.04
strategy:
matrix:
php: ['8.2', '8.3', '8.4']
php: ['8.2', '8.3', '8.4', '8.5']
steps:
- uses: actions/checkout@v4

Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2015-2025, Dan Brown and the BookStack project contributors.
Copyright (c) 2015-2026, Dan Brown and the BookStack project contributors.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
6 changes: 6 additions & 0 deletions app/Access/Controllers/HandlesPartialLogins.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@ protected function currentOrLastAttemptedUser(): User

return $user;
}

protected function clearLastAttemptedUser(): void
{
$loginService = app()->make(LoginService::class);
$loginService->clearLastLoginAttempted();
}
}
13 changes: 13 additions & 0 deletions app/Access/Controllers/MfaBackupCodesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use BookStack\Access\Mfa\BackupCodeService;
use BookStack\Access\Mfa\MfaSession;
use BookStack\Access\Mfa\MfaValue;
use BookStack\Access\Mfa\MfaVerificationLimiter;
use BookStack\Activity\ActivityType;
use BookStack\Exceptions\NotFoundException;
use BookStack\Http\Controller;
Expand All @@ -19,6 +20,11 @@ class MfaBackupCodesController extends Controller

protected const SETUP_SECRET_SESSION_KEY = 'mfa-setup-backup-codes';

public function __construct(
protected MfaVerificationLimiter $limiter,
) {
}

/**
* Show a view that generates and displays backup codes.
*/
Expand Down Expand Up @@ -71,6 +77,12 @@ public function confirm()
public function verify(Request $request, BackupCodeService $codeService, MfaSession $mfaSession, LoginService $loginService)
{
$user = $this->currentOrLastAttemptedUser();
$this->limiter->incrementAttempts($user, $request);
if ($this->limiter->hasHitLimit($user, $request)) {
$this->clearLastAttemptedUser();
$this->limiter->throwException();
}

$codes = MfaValue::getValueForUser($user, MfaValue::METHOD_BACKUP_CODES) ?? '[]';

$this->validate($request, [
Expand All @@ -89,6 +101,7 @@ function ($attribute, $value, $fail) use ($codeService, $codes) {

$mfaSession->markVerifiedForUser($user);
$loginService->reattemptLoginFor($user);
$this->limiter->decrementAttempts($user, $request);

if ($codeService->countCodesInSet($updatedCodes) < 5) {
$this->showWarningNotification(trans('auth.mfa_backup_codes_usage_limit_warning'));
Expand Down
11 changes: 10 additions & 1 deletion app/Access/Controllers/MfaTotpController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use BookStack\Access\LoginService;
use BookStack\Access\Mfa\MfaSession;
use BookStack\Access\Mfa\MfaValue;
use BookStack\Access\Mfa\MfaVerificationLimiter;
use BookStack\Access\Mfa\TotpService;
use BookStack\Access\Mfa\TotpValidationRule;
use BookStack\Activity\ActivityType;
Expand All @@ -20,7 +21,8 @@ class MfaTotpController extends Controller
protected const SETUP_SECRET_SESSION_KEY = 'mfa-setup-totp-secret';

public function __construct(
protected TotpService $totp
protected TotpService $totp,
protected MfaVerificationLimiter $limiter,
) {
}

Expand Down Expand Up @@ -86,6 +88,12 @@ public function confirm(Request $request)
public function verify(Request $request, LoginService $loginService, MfaSession $mfaSession)
{
$user = $this->currentOrLastAttemptedUser();
$this->limiter->incrementAttempts($user, $request);
if ($this->limiter->hasHitLimit($user, $request)) {
$this->clearLastAttemptedUser();
$this->limiter->throwException();
}

$totpSecret = MfaValue::getValueForUser($user, MfaValue::METHOD_TOTP);

$this->validate($request, [
Expand All @@ -98,6 +106,7 @@ public function verify(Request $request, LoginService $loginService, MfaSession

$mfaSession->markVerifiedForUser($user);
$loginService->reattemptLoginFor($user);
$this->limiter->decrementAttempts($user, $request);

return redirect()->intended();
}
Expand Down
22 changes: 13 additions & 9 deletions app/Access/Controllers/OidcController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@

class OidcController extends Controller
{
protected OidcService $oidcService;

public function __construct(OidcService $oidcService)
{
$this->oidcService = $oidcService;
public function __construct(
protected OidcService $oidcService
) {
$this->middleware('guard:oidc');
}

Expand All @@ -30,7 +28,7 @@ public function login()
return redirect('/login');
}

session()->flash('oidc_state', $loginDetails['state']);
session()->put('oidc_state', time() . ':' . $loginDetails['state']);

return redirect($loginDetails['url']);
}
Expand All @@ -41,10 +39,16 @@ public function login()
*/
public function callback(Request $request)
{
$storedState = session()->pull('oidc_state');
$responseState = $request->query('state');
$splitState = explode(':', session()->pull('oidc_state', ':'), 2);
if (count($splitState) !== 2) {
$splitState = [null, null];
}

[$storedStateTime, $storedState] = $splitState;
$threeMinutesAgo = time() - 3 * 60;

if ($storedState !== $responseState) {
if (!$storedState || $storedState !== $responseState || intval($storedStateTime) < $threeMinutesAgo) {
$this->showErrorNotification(trans('errors.oidc_fail_authed', ['system' => config('oidc.name')]));

return redirect('/login');
Expand All @@ -62,7 +66,7 @@ public function callback(Request $request)
}

/**
* Log the user out then start the OIDC RP-initiated logout process.
* Log the user out, then start the OIDC RP-initiated logout process.
*/
public function logout()
{
Expand Down
3 changes: 1 addition & 2 deletions app/Access/Controllers/RegisterController.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ public function getRegister()
public function postRegister(Request $request)
{
$this->registrationService->ensureRegistrationAllowed();
$this->validator($request->all())->validate();
$userData = $request->all();
$userData = $this->validator($request->all())->validate();

try {
$user = $this->registrationService->registerUser($userData);
Expand Down
24 changes: 3 additions & 21 deletions app/Access/ExternalBaseUserProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,18 @@

namespace BookStack\Access;

use BookStack\Users\Models\User;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Database\Eloquent\Model;

class ExternalBaseUserProvider implements UserProvider
{
public function __construct(
protected string $model
) {
}

/**
* Create a new instance of the model.
*/
public function createModel(): Model
{
$class = '\\' . ltrim($this->model, '\\');

return new $class();
}

/**
* Retrieve a user by their unique identifier.
*/
public function retrieveById(mixed $identifier): ?Authenticatable
{
return $this->createModel()->newQuery()->find($identifier);
return User::query()->find($identifier);
}

/**
Expand Down Expand Up @@ -59,10 +44,7 @@ public function updateRememberToken(Authenticatable $user, $token)
*/
public function retrieveByCredentials(array $credentials): ?Authenticatable
{
// Search current user base by looking up a uid
$model = $this->createModel();

return $model->newQuery()
return User::query()
->where('external_auth_id', $credentials['external_auth_id'])
->first();
}
Expand Down
20 changes: 6 additions & 14 deletions app/Access/Guards/AsyncExternalBaseSessionGuard.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,28 @@
namespace BookStack\Access\Guards;

/**
* Saml2 Session Guard.
* External Auth Session Guard.
*
* The saml2 login process is async in nature meaning it does not fit very well
* into the default laravel 'Guard' auth flow. Instead most of the logic is done
* via the Saml2 controller & Saml2Service. This class provides a safer, thin
* version of SessionGuard.
* The login process for external auth (SAML2/OIDC) is async in nature, meaning it does not fit very well
* into the default laravel 'Guard' auth flow. Instead, most of the logic is done via the relevant
* controller and services. This class provides a safer, thin version of SessionGuard.
*/
class AsyncExternalBaseSessionGuard extends ExternalBaseSessionGuard
{
/**
* Validate a user's credentials.
*
* @param array $credentials
*
* @return bool
*/
public function validate(array $credentials = [])
public function validate(array $credentials = []): bool
{
return false;
}

/**
* Attempt to authenticate a user using the given credentials.
*
* @param array $credentials
* @param bool $remember
*
* @return bool
*/
public function attempt(array $credentials = [], $remember = false)
public function attempt(array $credentials = [], $remember = false): bool
{
return false;
}
Expand Down
Loading