diff --git a/.github/translators.txt b/.github/translators.txt index 10bb7d325..8bdefe9b5 100644 --- a/.github/translators.txt +++ b/.github/translators.txt @@ -267,3 +267,4 @@ Filip Antala (AntalaFilip) :: Slovak mcgong (GongMingCai) :: Chinese Simplified; Chinese Traditional Nanang Setia Budi (sefidananang) :: Indonesian Андрей Павлов (andrei.pavlov) :: Russian +Alex Navarro (alex.n.navarro) :: Portuguese, Brazilian diff --git a/app/Actions/ActivityType.php b/app/Actions/ActivityType.php index 0ad25a5ab..2a9615093 100644 --- a/app/Actions/ActivityType.php +++ b/app/Actions/ActivityType.php @@ -29,6 +29,9 @@ class ActivityType const COMMENTED_ON = 'commented_on'; const PERMISSIONS_UPDATE = 'permissions_update'; + const REVISION_RESTORE = 'revision_restore'; + const REVISION_DELETE = 'revision_delete'; + const SETTINGS_UPDATE = 'settings_update'; const MAINTENANCE_ACTION_RUN = 'maintenance_action_run'; diff --git a/app/Entities/Models/PageRevision.php b/app/Entities/Models/PageRevision.php index be2ac33a0..6517b0080 100644 --- a/app/Entities/Models/PageRevision.php +++ b/app/Entities/Models/PageRevision.php @@ -3,6 +3,7 @@ namespace BookStack\Entities\Models; use BookStack\Auth\User; +use BookStack\Interfaces\Loggable; use BookStack\Model; use Carbon\Carbon; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -27,7 +28,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property Page $page * @property-read ?User $createdBy */ -class PageRevision extends Model +class PageRevision extends Model implements Loggable { protected $fillable = ['name', 'text', 'summary']; protected $hidden = ['html', 'markdown', 'restricted', 'text']; @@ -83,4 +84,9 @@ class PageRevision extends Model { return $type === 'revision'; } + + public function logDescriptor(): string + { + return "Revision #{$this->revision_number} (ID: {$this->id}) for page ID {$this->page_id}"; + } } diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index e3c6bd17a..60f1d1b01 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -337,6 +337,7 @@ class PageRepo $this->savePageRevision($page, $summary); Activity::add(ActivityType::PAGE_RESTORE, $page); + Activity::add(ActivityType::REVISION_RESTORE, $revision); return $page; } diff --git a/app/Facades/Activity.php b/app/Facades/Activity.php index 6c279a057..ec3d28cc0 100644 --- a/app/Facades/Activity.php +++ b/app/Facades/Activity.php @@ -5,7 +5,7 @@ namespace BookStack\Facades; use Illuminate\Support\Facades\Facade; /** - * @see \BookStack\Actions\ActivityLogger + * @mixin \BookStack\Actions\ActivityLogger */ class Activity extends Facade { diff --git a/app/Http/Controllers/Api/UserApiController.php b/app/Http/Controllers/Api/UserApiController.php index 4f0d30034..64e9d732d 100644 --- a/app/Http/Controllers/Api/UserApiController.php +++ b/app/Http/Controllers/Api/UserApiController.php @@ -36,26 +36,26 @@ class UserApiController extends ApiController { return [ 'create' => [ - 'name' => ['required', 'min:2'], + 'name' => ['required', 'min:2', 'max:100'], 'email' => [ 'required', 'min:2', 'email', new Unique('users', 'email'), ], 'external_auth_id' => ['string'], - 'language' => ['string'], + 'language' => ['string', 'max:15', 'alpha_dash'], 'password' => [Password::default()], 'roles' => ['array'], 'roles.*' => ['integer'], 'send_invite' => ['boolean'], ], 'update' => [ - 'name' => ['min:2'], + 'name' => ['min:2', 'max:100'], 'email' => [ 'min:2', 'email', (new Unique('users', 'email'))->ignore($userId ?? null), ], 'external_auth_id' => ['string'], - 'language' => ['string'], + 'language' => ['string', 'max:15', 'alpha_dash'], 'password' => [Password::default()], 'roles' => ['array'], 'roles.*' => ['integer'], diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 9399e8b7f..b0aec1177 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -30,9 +30,9 @@ class RegisterController extends Controller use RegistersUsers; - protected $socialAuthService; - protected $registrationService; - protected $loginService; + protected SocialAuthService $socialAuthService; + protected RegistrationService $registrationService; + protected LoginService $loginService; /** * Where to redirect users after login / registration. @@ -69,7 +69,7 @@ class RegisterController extends Controller protected function validator(array $data) { return Validator::make($data, [ - 'name' => ['required', 'min:2', 'max:255'], + 'name' => ['required', 'min:2', 'max:100'], 'email' => ['required', 'email', 'max:255', 'unique:users'], 'password' => ['required', Password::default()], ]); diff --git a/app/Http/Controllers/PageRevisionController.php b/app/Http/Controllers/PageRevisionController.php index c6a4926d2..086518960 100644 --- a/app/Http/Controllers/PageRevisionController.php +++ b/app/Http/Controllers/PageRevisionController.php @@ -2,9 +2,11 @@ namespace BookStack\Http\Controllers; +use BookStack\Actions\ActivityType; use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Tools\PageContent; use BookStack\Exceptions\NotFoundException; +use BookStack\Facades\Activity; use Ssddanbrown\HtmlDiff\Diff; class PageRevisionController extends Controller @@ -132,6 +134,7 @@ class PageRevisionController extends Controller } $revision->delete(); + Activity::add(ActivityType::REVISION_DELETE, $revision); $this->showSuccessNotification(trans('entities.revision_delete_success')); return redirect($page->getUrl('/revisions')); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 3110f1a98..895481d02 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -18,8 +18,8 @@ use Illuminate\Validation\ValidationException; class UserController extends Controller { - protected $userRepo; - protected $imageRepo; + protected UserRepo $userRepo; + protected ImageRepo $imageRepo; /** * UserController constructor. @@ -81,9 +81,9 @@ class UserController extends Controller $passwordRequired = ($authMethod === 'standard' && !$sendInvite); $validationRules = [ - 'name' => ['required'], + 'name' => ['required', 'max:100'], 'email' => ['required', 'email', 'unique:users,email'], - 'language' => ['string'], + 'language' => ['string', 'max:15', 'alpha_dash'], 'roles' => ['array'], 'roles.*' => ['integer'], 'password' => $passwordRequired ? ['required', Password::default()] : null, @@ -139,11 +139,11 @@ class UserController extends Controller $this->checkPermissionOrCurrentUser('users-manage', $id); $validated = $this->validate($request, [ - 'name' => ['min:2'], + 'name' => ['min:2', 'max:100'], 'email' => ['min:2', 'email', 'unique:users,email,' . $id], 'password' => ['required_with:password_confirm', Password::default()], 'password-confirm' => ['same:password', 'required_with:password'], - 'language' => ['string'], + 'language' => ['string', 'max:15', 'alpha_dash'], 'roles' => ['array'], 'roles.*' => ['integer'], 'external_auth_id' => ['string'], diff --git a/resources/lang/nl/entities.php b/resources/lang/nl/entities.php index 702328264..ad1c71618 100644 --- a/resources/lang/nl/entities.php +++ b/resources/lang/nl/entities.php @@ -171,7 +171,7 @@ return [ 'chapters_permissions_active' => 'Hoofdstuk Machtigingen Actief', 'chapters_permissions_success' => 'Hoofdstuk Machtigingen Bijgewerkt', 'chapters_search_this' => 'Doorzoek dit hoofdstuk', - 'chapter_sort_book' => 'Sort Book', + 'chapter_sort_book' => 'Sorteer Boek', // Pages 'page' => 'Pagina', diff --git a/resources/lang/pt_BR/activities.php b/resources/lang/pt_BR/activities.php index 4f068844e..0006a9e91 100644 --- a/resources/lang/pt_BR/activities.php +++ b/resources/lang/pt_BR/activities.php @@ -28,8 +28,8 @@ return [ // Books 'book_create' => 'criou o livro', 'book_create_notification' => 'Livro criado com sucesso', - 'book_create_from_chapter' => 'converted chapter to book', - 'book_create_from_chapter_notification' => 'Chapter successfully converted to a book', + 'book_create_from_chapter' => 'capítulo convertido em livro', + 'book_create_from_chapter_notification' => 'Capítulo convertido com sucesso em um livro', 'book_update' => 'atualizou o livro', 'book_update_notification' => 'Livro atualizado com sucesso', 'book_delete' => 'excluiu o livro', @@ -40,8 +40,8 @@ return [ // Bookshelves 'bookshelf_create' => 'prateleira criada', 'bookshelf_create_notification' => 'Prateleira criada com sucesso', - 'bookshelf_create_from_book' => 'converted book to bookshelf', - 'bookshelf_create_from_book_notification' => 'Book successfully converted to a shelf', + 'bookshelf_create_from_book' => 'livro convertido em estante', + 'bookshelf_create_from_book_notification' => 'Capítulo convertido com sucesso em um livro', 'bookshelf_update' => 'atualizou a prateleira', 'bookshelf_update_notification' => 'Prateleira atualizada com sucesso', 'bookshelf_delete' => 'excluiu a prateleira', diff --git a/resources/views/layouts/export.blade.php b/resources/views/layouts/export.blade.php index d631ad3c9..e041d8dea 100644 --- a/resources/views/layouts/export.blade.php +++ b/resources/views/layouts/export.blade.php @@ -12,8 +12,10 @@ @include('exports.parts.custom-head') +@include('layouts.parts.export-body-start')
@yield('content')
+@include('layouts.parts.export-body-end') \ No newline at end of file diff --git a/resources/views/layouts/parts/export-body-end.blade.php b/resources/views/layouts/parts/export-body-end.blade.php new file mode 100644 index 000000000..471198979 --- /dev/null +++ b/resources/views/layouts/parts/export-body-end.blade.php @@ -0,0 +1,2 @@ +{{-- This is a placeholder template file provided as a --}} +{{-- convenience to users of the visual theme system. --}} \ No newline at end of file diff --git a/resources/views/layouts/parts/export-body-start.blade.php b/resources/views/layouts/parts/export-body-start.blade.php new file mode 100644 index 000000000..471198979 --- /dev/null +++ b/resources/views/layouts/parts/export-body-start.blade.php @@ -0,0 +1,2 @@ +{{-- This is a placeholder template file provided as a --}} +{{-- convenience to users of the visual theme system. --}} \ No newline at end of file diff --git a/resources/views/settings/audit.blade.php b/resources/views/settings/audit.blade.php index b856d1150..2daeb8a82 100644 --- a/resources/views/settings/audit.blade.php +++ b/resources/views/settings/audit.blade.php @@ -13,7 +13,12 @@