diff --git a/.env.docker b/.env.docker index a1fa4fa1..800d3fcf 100644 --- a/.env.docker +++ b/.env.docker @@ -24,9 +24,9 @@ SESSION_LIFETIME=10080 ## Backup configuration # Enable backups here BACKUP_ENABLED=false -# Choose the destination of the backup. If you set up AWS S3 credentials below you may choose 'cloud' which is used +# Choose the destination of the backup. If you set up AWS S3 credentials below you may choose 's3' which is used # as a synonym for AWS. Leave blank or set to 'local' if you want to store backups within /storage/app/backups. -BACKUP_DISK=cloud +BACKUP_DISK=s3 # Set to false if you do not want to be notified about successful or broken backups BACKUP_NOTIFICATIONS=true # The notification email may be used to get backup notifications diff --git a/.env.docker.production b/.env.docker.production index ce16ed5d..bf327984 100644 --- a/.env.docker.production +++ b/.env.docker.production @@ -24,9 +24,9 @@ SESSION_LIFETIME=10080 ## Backup configuration # Enable backups here BACKUP_ENABLED=false -# Choose the destination of the backup. If you set up AWS S3 credentials below you may choose 'cloud' which is used +# Choose the destination of the backup. If you set up AWS S3 credentials below you may choose 's3' which is used # as a synonym for AWS. Leave blank or set to 'local' if you want to store backups within /storage/app/backups. -BACKUP_DISK=cloud +BACKUP_DISK=s3 # Set to false if you do not want to be notified about successful or broken backups BACKUP_NOTIFICATIONS=true # The notification email may be used to get backup notifications diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 85f1302e..f6a5994e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,12 +23,17 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** +**LinkAce setup (please complete the following information):** + - Version: [e.g. 0.0.43] + - Installed via: [e.g. PHP, Docker] + - OS: [e.g. Ubuntu, CentOS] + +**Desktop (please complete the following information if applicable):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] -**Smartphone (please complete the following information):** +**Smartphone (please complete the following information if applicable):** - Device: [e.g. iPhone6] - OS: [e.g. iOS8.1] - Browser [e.g. stock browser, safari] diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 59feed3d..9843a1d8 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest an idea for this project title: '' -labels: New Feature +labels: Enhancement assignees: '' --- diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 14306a2a..9a95e590 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [12.x] + node-version: ['12.x', '14.x'] name: Test asset generation process on Node ${{ matrix.node-version }} diff --git a/README.md b/README.md index 8a9aebfb..d5a34b35 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,17 @@
- +
-
Your selfhosted bookmark archive with a simple interface and advanced features.
-:warning: This application is still in development! :warning:
+Your self-hosted bookmark archive. Free and open source.
@@ -33,31 +32,28 @@ ![Preview Screenshot](https://www.linkace.org/images/preview/linkace_dashboard.png) -LinkAce is a bookmark manager similar to Shaarli and other tools. I built this tool to have something that fits my -actual needs which other bookmark managers couldn't solve, even if most features are almost the same. +LinkAce is a bookmark manager similar to Shaarli and other tools. See this tool as a long-term archive for sites you want to remember, but don't access frequently. I built this tool to have something that fits my actual needs which other bookmark managers couldn't solve, even if some features look almost the same. -#### Features +#### Feature Highlights * Save links with automatic title and description generation. -* Automated link checks to make sure your bookmarks stay available. -* Automated “backups” of your bookmarks via the Waybackmachine. -* Organize bookmarks in lists and tags. +* Automated link checks inform you when any links become unavailable or were moved. +* Automated “backups” of saved sites via the [Waybackmachine](https://web.archive.org/). +* Organize bookmarks with lists and tags. +* A full REST API offers access to all features of LinkAce from third-party apps and services. * A bookmarklet to quickly save links from any browser. -* Private or public links, so friends or internet strangers can see your collection. -* Add notes to links to add thoughts or other information. -* Advanced search including different filters and ordering. -* Import existing bookmarks from HTML exports (other methods planned). -* Support for complete database and app backups to Amazon AWS S3. +* Links can be private or public, so friends or internet strangers may see your collection. +* Add notes to links to add thoughts or other relevant information. +* An advanced search including different filters and ordering. +* Import and export of bookmarks from HTML. +* Support for complete database and application backups to Amazon AWS S3. * A built-in light and dark color scheme. -More features are already planned. Take a look at the [project board](https://github.com/Kovah/LinkAce/projects/1) -for more information. +More features are already planned. Take a look at the [project board](https://github.com/Kovah/LinkAce/projects/1) for more information. #### Documentation and Community -Any further information about all the available features and how to install the app, can be found on the -[LinkAce Website](https://www.linkace.org/). Additionally, you may visit the [community forums](https://spectrum.chat/linkace/) -to share your ideas, talk with other users or find help for specific problems. +Any further information about all the available features and how to install the app, can be found on the [LinkAce Website](https://www.linkace.org/). Additionally, you may visit the [community forums](https://community.linkace.org/) to share your ideas, talk with other users or find help for specific problems. --- @@ -65,13 +61,9 @@ to share your ideas, talk with other users or find help for specific problems. ### :bulb: Support for LinkAce -Free support is highly limited for all my free tools, including LinkAce. If you need help please visit the -[community forum](https://spectrum.chat/linkace/) and post your issue there. I do not offer free personal -support via chat or email. -Please notice that LinkAce has specific requirements to run correctly. +I built LinkAce to solve my problem, and I now offer my solution and code to your without charging anything. I spent a lot of my free time building this application already, so I won't offer any *free* personal support, customization or installation help. If you need help please visit the [community forum](https://community.linkace.org/) and post your issue there. -If you need prioritized support you can **become a [Patreon](https://www.patreon.com/Kovah)** -or **[Github Sponsor](https://github.com/sponsors/Kovah)**. :star: +You can get personal and dedicated support by **becoming a [Patreon](https://www.patreon.com/Kovah)** or **[Github Sponsor](https://github.com/sponsors/Kovah)**. :star: --- @@ -79,8 +71,7 @@ or **[Github Sponsor](https://github.com/sponsors/Kovah)**. :star: ### :gear: Setup -LinkAce provides multiple ways of installing it on your server. The complete documentation for all installation -methods can be found [**in the wiki**](https://www.linkace.org/docs/v1/setup/). +LinkAce provides multiple ways of installing it on your server. The complete documentation for all installation methods can be found [**in the wiki**](https://www.linkace.org/docs/v1/setup/). * Setup with Docker (_recommended_) * Simple setup with 1 Docker image @@ -93,6 +84,8 @@ methods can be found [**in the wiki**](https://www.linkace.org/docs/v1/setup/). ### :construction: Contribution +[![Translations](https://img.shields.io/badge/Translations-Crowdin-2b303d)](https://crowdin.com/project/linkace) [![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/Kovah/LinkAce) ![Code Climate coverage](https://img.shields.io/codeclimate/coverage/Kovah/LinkAce)](https://codeclimate.com/github/Kovah/LinkAce) [![GitHub Build Status](https://img.shields.io/github/workflow/status/Kovah/LinkAce/Testing/dev?label=Dev%20Build)](https://github.com/Kovah/LinkAce/actions?query=workflow%3ATesting+branch%3Adev) + Please review the [**contribution guidelines**](CONTRIBUTING.md) before starting to work on any features. @@ -105,9 +98,7 @@ Please review the [**contribution guidelines**](CONTRIBUTING.md) before starting #### 1. Basic Setup -The following steps assume that you are using Docker for development, which I highly encourage. If you use -other ways to work with PHP projects you must adapt the commands to your system. -Clone the repository to your machine and run the following commands to start the Docker container system: +The following steps assume that you are using Docker for development, which I highly encourage. If you use other ways to work with PHP projects you must adapt the commands to your system. Clone the repository to your machine and run the following commands to start the Docker container system: ```bash cp .env.docker .env @@ -120,8 +111,7 @@ Now, install all dependencies from inside the PHP container: docker exec linkace-php bash -c "composer install" ``` -Last step: compile all assets. Node 10 LTS is the minimum version required and recommended to use. -You may use either NPM or Yarn for installing the asset dependencies. +Last step: compile all assets. Node 10 LTS is the minimum version required and recommended to use. You may use either NPM or Yarn for installing the asset dependencies. ```bash npm install @@ -133,8 +123,7 @@ npm run dev #### 2. Working with the Artisan command line -I recommend using the Artisan command line tool in the PHP container only, to make sure that the same environment is -used. To do so, use the following example command: +I recommend using the Artisan command line tool in the PHP container only, to make sure that the same environment is used. To do so, use the following example command: ```bash docker exec linkace-php bash -c "php artisan migrate" diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php new file mode 100644 index 00000000..cc593f31 --- /dev/null +++ b/app/Actions/Fortify/CreateNewUser.php @@ -0,0 +1,41 @@ + ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique(User::class), + ], + 'password' => $this->passwordRules(), + ])->validate(); + + return User::create([ + 'name' => $input['name'], + 'email' => $input['email'], + 'password' => Hash::make($input['password']), + ]); + } +} diff --git a/app/Actions/Fortify/PasswordValidationRules.php b/app/Actions/Fortify/PasswordValidationRules.php new file mode 100644 index 00000000..78ed8cfe --- /dev/null +++ b/app/Actions/Fortify/PasswordValidationRules.php @@ -0,0 +1,18 @@ + $this->passwordRules(), + ])->validate(); + + $user->forceFill([ + 'password' => Hash::make($input['password']), + ])->save(); + } +} diff --git a/app/Actions/Fortify/UpdateUserPassword.php b/app/Actions/Fortify/UpdateUserPassword.php new file mode 100644 index 00000000..fa3106c1 --- /dev/null +++ b/app/Actions/Fortify/UpdateUserPassword.php @@ -0,0 +1,35 @@ + ['required', 'string'], + 'password' => $this->passwordRules(), + ])->after(function ($validator) use ($user, $input) { + if (! Hash::check($input['current_password'], $user->password)) { + $validator->errors()->add('current_password', trans('settings.old_password_invalid')); + } + })->validateWithBag('updatePassword'); + + $user->forceFill([ + 'password' => Hash::make($input['password']), + ])->save(); + } +} diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php new file mode 100644 index 00000000..57fc487e --- /dev/null +++ b/app/Actions/Fortify/UpdateUserProfileInformation.php @@ -0,0 +1,60 @@ + ['required', 'string', 'max:255'], + + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique('users')->ignore($user->id), + ], + ])->validateWithBag('updateProfileInformation'); + + if ($input['email'] !== $user->email && $user instanceof MustVerifyEmail) { + $this->updateVerifiedUser($user, $input); + } else { + $user->forceFill([ + 'name' => $input['name'], + 'email' => $input['email'], + ])->save(); + } + } + + /** + * Update the given verified user's profile information. + * + * @param mixed $user + * @param array $input + * @return void + */ + protected function updateVerifiedUser($user, array $input) + { + $user->forceFill([ + 'name' => $input['name'], + 'email' => $input['email'], + 'email_verified_at' => null, + ])->save(); + + $user->sendEmailVerificationNotification(); + } +} diff --git a/app/Console/Commands/CheckLinksCommand.php b/app/Console/Commands/CheckLinksCommand.php index c1556055..fa091a33 100644 --- a/app/Console/Commands/CheckLinksCommand.php +++ b/app/Console/Commands/CheckLinksCommand.php @@ -138,7 +138,7 @@ protected function checkLink(Link $link): void $this->output->write('Checking link ' . $link->url . ' '); try { - $response = Http::timeout(5)->get($link->url); + $response = Http::timeout(10)->get($link->url); $statusCode = $response->status(); } catch (\Exception $e) { // Set status code to null so the link will be marked as broken diff --git a/app/Console/Commands/CleanupLinkHistoriesCommand.php b/app/Console/Commands/CleanupLinkHistoriesCommand.php new file mode 100644 index 00000000..10ff255f --- /dev/null +++ b/app/Console/Commands/CleanupLinkHistoriesCommand.php @@ -0,0 +1,60 @@ +argument('field')) { + $baseQuery->where('key', $this->argument('field')); + } + + $count = $baseQuery->count(); + + if ($count === 0) { + $this->warn(sprintf('No history entries%s found!', ($this->argument('field') ? ' for this field ' : ''))); + return; + } + + $linkCount = $baseQuery->groupBy('revisionable_id')->get('revisionable_id')->count(); + + $this->info(" Found $count entries across $linkCount links."); + + if (!$this->confirm('Are you sure you want to remove these history entries?')) { + return; + } + + $this->offset = (int)$this->ask('How many history entries should be kept?', 5); + + $bar = $this->output->createProgressBar($linkCount); + $bar->start(); + + Link::withTrashed()->has('revisionHistory')->each(function (Link $link) use ($bar) { + $historyEntries = $link->revisionHistory()->orderBy('created_at', 'desc') + ->skip($this->offset)->take(9999999) + ->pluck('id'); + + Revision::whereIn('id', $historyEntries)->delete(); + $bar->advance(); + }); + + $bar->finish(); + $this->line(''); + + $this->info(" Successfully deleted $count entries."); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index d6102669..35f2f159 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -3,6 +3,7 @@ namespace App\Console; use App\Console\Commands\CheckLinksCommand; +use App\Console\Commands\CleanupLinkHistoriesCommand; use App\Console\Commands\RegisterUserCommand; use App\Console\Commands\ResetPasswordCommand; use Illuminate\Console\Scheduling\Schedule; @@ -24,6 +25,7 @@ class Kernel extends ConsoleKernel RegisterUserCommand::class, CheckLinksCommand::class, ResetPasswordCommand::class, + CleanupLinkHistoriesCommand::class, ]; /** diff --git a/app/Http/Controllers/API/LinkController.php b/app/Http/Controllers/API/LinkController.php index 68f0e0c3..6caaea20 100644 --- a/app/Http/Controllers/API/LinkController.php +++ b/app/Http/Controllers/API/LinkController.php @@ -48,12 +48,12 @@ public function store(LinkStoreRequest $request): JsonResponse /** * Display the specified resource. * - * @param int $id + * @param Link $link * @return JsonResponse */ - public function show($id): JsonResponse + public function show(Link $link): JsonResponse { - $link = Link::with(['lists', 'tags'])->findOrFail($id); + $link->load(['lists', 'tags']); return response()->json($link); } @@ -62,13 +62,11 @@ public function show($id): JsonResponse * Update the specified resource in storage. * * @param LinkUpdateRequest $request - * @param int $id + * @param Link $link * @return JsonResponse */ - public function update(LinkUpdateRequest $request, $id): JsonResponse + public function update(LinkUpdateRequest $request, Link $link): JsonResponse { - $link = Link::findOrFail($id); - $updatedLink = LinkRepository::update($link, $request->all()); return response()->json($updatedLink); @@ -77,17 +75,14 @@ public function update(LinkUpdateRequest $request, $id): JsonResponse /** * Remove the specified resource from storage. * - * @param LinkDeleteRequest $request - * @param int $id + * @param Link $link * @return JsonResponse */ - public function destroy(LinkDeleteRequest $request, $id): JsonResponse + public function destroy(Link $link): JsonResponse { - $link = Link::findOrFail($id); - - $deletionSuccessfull = LinkRepository::delete($link); + $deletionSuccessful = LinkRepository::delete($link); - if ($deletionSuccessfull) { + if ($deletionSuccessful) { return response()->json(null, Response::HTTP_OK); } diff --git a/app/Http/Controllers/API/LinkNotesController.php b/app/Http/Controllers/API/LinkNotesController.php index f8e6a627..6b5f5e5b 100644 --- a/app/Http/Controllers/API/LinkNotesController.php +++ b/app/Http/Controllers/API/LinkNotesController.php @@ -11,13 +11,11 @@ class LinkNotesController extends Controller /** * Get the notes for a specific link. * - * @param $linkID + * @param Link $link * @return JsonResponse */ - public function __invoke($linkID): JsonResponse + public function __invoke(Link $link): JsonResponse { - $link = Link::findOrFail($linkID); - $notes = $link->notes()->paginate(getPaginationLimit()); return response()->json($notes); diff --git a/app/Http/Controllers/API/ListController.php b/app/Http/Controllers/API/ListController.php index 1f4283bf..3400b415 100644 --- a/app/Http/Controllers/API/ListController.php +++ b/app/Http/Controllers/API/ListController.php @@ -48,14 +48,12 @@ public function store(ListStoreRequest $request): JsonResponse /** * Display the specified resource. * - * @param int $id + * @param LinkList $list * @return JsonResponse */ - public function show($id): JsonResponse + public function show(LinkList $list): JsonResponse { - $list = LinkList::findOrFail($id); - - $list->links = route('api.lists.links', [$id], true); + $list->setAttribute('links', route('api.lists.links', [$list->id], true)); return response()->json($list); } @@ -64,13 +62,11 @@ public function show($id): JsonResponse * Update the specified resource in storage. * * @param ListUpdateRequest $request - * @param int $id + * @param LinkList $list * @return JsonResponse */ - public function update(ListUpdateRequest $request, $id): JsonResponse + public function update(ListUpdateRequest $request, LinkList $list): JsonResponse { - $list = LinkList::findOrFail($id); - $updatedList = ListRepository::update($list, $request->all()); return response()->json($updatedList); @@ -79,17 +75,14 @@ public function update(ListUpdateRequest $request, $id): JsonResponse /** * Remove the specified resource from storage. * - * @param ListDeleteRequest $request - * @param int $id + * @param LinkList $list * @return JsonResponse */ - public function destroy(ListDeleteRequest $request, $id): JsonResponse + public function destroy(LinkList $list): JsonResponse { - $list = LinkList::findOrFail($id); - - $deletionSuccessfull = ListRepository::delete($list); + $deletionSuccessful = ListRepository::delete($list); - if ($deletionSuccessfull) { + if ($deletionSuccessful) { return response()->json(null, Response::HTTP_OK); } diff --git a/app/Http/Controllers/API/ListLinksController.php b/app/Http/Controllers/API/ListLinksController.php index 7c1cde82..673ad198 100644 --- a/app/Http/Controllers/API/ListLinksController.php +++ b/app/Http/Controllers/API/ListLinksController.php @@ -11,13 +11,11 @@ class ListLinksController extends Controller /** * Get the links for a specific list. * - * @param $listID + * @param LinkList $list * @return JsonResponse */ - public function __invoke($listID): JsonResponse + public function __invoke(LinkList $list): JsonResponse { - $list = LinkList::findOrFail($listID); - $links = $list->links()->paginate(getPaginationLimit()); return response()->json($links); diff --git a/app/Http/Controllers/API/NoteController.php b/app/Http/Controllers/API/NoteController.php index 5f7cc498..3d2e7323 100644 --- a/app/Http/Controllers/API/NoteController.php +++ b/app/Http/Controllers/API/NoteController.php @@ -30,13 +30,11 @@ public function store(NoteStoreRequest $request): JsonResponse * Update the specified resource in storage. * * @param NoteUpdateRequest $request - * @param int $id + * @param Note $note * @return JsonResponse */ - public function update(NoteUpdateRequest $request, $id): JsonResponse + public function update(NoteUpdateRequest $request, Note $note): JsonResponse { - $note = Note::findOrFail($id); - $updatedNote = NoteRepository::update($note, $request->all()); return response()->json($updatedNote); @@ -45,17 +43,14 @@ public function update(NoteUpdateRequest $request, $id): JsonResponse /** * Remove the specified resource from storage. * - * @param NoteDeleteRequest $request - * @param int $id + * @param Note $note * @return JsonResponse */ - public function destroy(NoteDeleteRequest $request, $id): JsonResponse + public function destroy(Note $note): JsonResponse { - $note = Note::findOrFail($id); - - $deletionSuccessfull = NoteRepository::delete($note); + $deletionSuccessful = NoteRepository::delete($note); - if ($deletionSuccessfull) { + if ($deletionSuccessful) { return response()->json(null, Response::HTTP_OK); } diff --git a/app/Http/Controllers/API/TagController.php b/app/Http/Controllers/API/TagController.php index 6f8020a9..b2b5bb07 100644 --- a/app/Http/Controllers/API/TagController.php +++ b/app/Http/Controllers/API/TagController.php @@ -48,13 +48,11 @@ public function store(TagStoreRequest $request): JsonResponse /** * Display the specified resource. * - * @param int $id + * @param Tag $tag * @return JsonResponse */ - public function show($id): JsonResponse + public function show(Tag $tag): JsonResponse { - $tag = Tag::findOrFail($id); - return response()->json($tag); } @@ -62,13 +60,11 @@ public function show($id): JsonResponse * Update the specified resource in storage. * * @param TagUpdateRequest $request - * @param int $id + * @param Tag $tag * @return JsonResponse */ - public function update(TagUpdateRequest $request, $id): JsonResponse + public function update(TagUpdateRequest $request, Tag $tag): JsonResponse { - $tag = Tag::findOrFail($id); - $updatedTag = TagRepository::update($tag, $request->all()); return response()->json($updatedTag); @@ -77,17 +73,14 @@ public function update(TagUpdateRequest $request, $id): JsonResponse /** * Remove the specified resource from storage. * - * @param TagDeleteRequest $request - * @param int $id + * @param Tag $tag * @return JsonResponse */ - public function destroy(TagDeleteRequest $request, $id): JsonResponse + public function destroy(Tag $tag): JsonResponse { - $tag = Tag::findOrFail($id); - - $deletionSuccessfull = TagRepository::delete($tag); + $deletionSuccessful = TagRepository::delete($tag); - if ($deletionSuccessfull) { + if ($deletionSuccessful) { return response()->json(null, Response::HTTP_OK); } diff --git a/app/Http/Controllers/API/TagLinksController.php b/app/Http/Controllers/API/TagLinksController.php index d8999268..03519c75 100644 --- a/app/Http/Controllers/API/TagLinksController.php +++ b/app/Http/Controllers/API/TagLinksController.php @@ -11,13 +11,11 @@ class TagLinksController extends Controller /** * Get the links for a specific tag. * - * @param $tagID + * @param Tag $tag * @return JsonResponse */ - public function __invoke($tagID): JsonResponse + public function __invoke(Tag $tag): JsonResponse { - $tag = Tag::findOrFail($tagID); - $links = $tag->links()->paginate(getPaginationLimit()); return response()->json($links); diff --git a/app/Http/Controllers/App/BookmarkletController.php b/app/Http/Controllers/App/BookmarkletController.php index 2015652f..e4cce525 100644 --- a/app/Http/Controllers/App/BookmarkletController.php +++ b/app/Http/Controllers/App/BookmarkletController.php @@ -6,7 +6,7 @@ use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class BookmarkletController extends Controller { @@ -39,9 +39,10 @@ public function getLinkAddForm(Request $request) session(['bookmarklet.create' => true]); - return view('actions.bookmarklet.create') - ->with('bookmark_url', $newUrl) - ->with('bookmark_title', $newTitle); + return view('actions.bookmarklet.create', [ + 'bookmark_url' => $newUrl, + 'bookmark_title' => $newTitle, + ]); } /** diff --git a/app/Http/Controllers/App/DashboardController.php b/app/Http/Controllers/App/DashboardController.php index 8d8b6d46..8988eaba 100644 --- a/app/Http/Controllers/App/DashboardController.php +++ b/app/Http/Controllers/App/DashboardController.php @@ -7,7 +7,7 @@ use App\Models\LinkList; use App\Models\Note; use App\Models\Tag; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class DashboardController extends Controller { diff --git a/app/Http/Controllers/App/ExportController.php b/app/Http/Controllers/App/ExportController.php index fd8ff560..f8c87ebf 100644 --- a/app/Http/Controllers/App/ExportController.php +++ b/app/Http/Controllers/App/ExportController.php @@ -8,7 +8,7 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; use League\Csv\CannotInsertRecord; use League\Csv\Writer; use Symfony\Component\HttpFoundation\StreamedResponse; diff --git a/app/Http/Controllers/App/ImportController.php b/app/Http/Controllers/App/ImportController.php index 1a50dfbc..e7e8ecb2 100644 --- a/app/Http/Controllers/App/ImportController.php +++ b/app/Http/Controllers/App/ImportController.php @@ -13,7 +13,7 @@ use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Log; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; use Shaarli\NetscapeBookmarkParser\NetscapeBookmarkParser; class ImportController extends Controller diff --git a/app/Http/Controllers/App/SearchController.php b/app/Http/Controllers/App/SearchController.php index 69f24bd9..1ed2c3f4 100644 --- a/app/Http/Controllers/App/SearchController.php +++ b/app/Http/Controllers/App/SearchController.php @@ -5,7 +5,7 @@ use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\SearchesLinks; use App\Http\Requests\SearchRequest; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class SearchController extends Controller { diff --git a/app/Http/Controllers/App/SystemSettingsController.php b/app/Http/Controllers/App/SystemSettingsController.php index a286ab0b..008102de 100644 --- a/app/Http/Controllers/App/SystemSettingsController.php +++ b/app/Http/Controllers/App/SystemSettingsController.php @@ -9,7 +9,7 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Str; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class SystemSettingsController extends Controller { @@ -65,7 +65,6 @@ public function saveSystemSettings(SystemSettingsUpdateRequest $request): Redire } flash(trans('settings.settings_saved')); - return redirect()->route('get-systemsettings'); } diff --git a/app/Http/Controllers/App/TrashController.php b/app/Http/Controllers/App/TrashController.php index 2be9ecd3..c0f03050 100644 --- a/app/Http/Controllers/App/TrashController.php +++ b/app/Http/Controllers/App/TrashController.php @@ -11,7 +11,7 @@ use App\Models\Tag; use App\Repositories\TrashRepository; use Illuminate\Http\RedirectResponse; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class TrashController extends Controller { @@ -57,7 +57,6 @@ public function clearTrash(TrashClearRequest $request): RedirectResponse TrashRepository::delete($request->input('model')); flash(trans('trash.delete_success.' . $request->input('model')), 'success'); - return redirect()->route('get-trash'); } @@ -72,7 +71,6 @@ public function restoreEntry(TrashRestoreRequest $request): RedirectResponse TrashRepository::restore($request->input('model'), $request->input('id')); flash(trans('trash.restore.' . $request->input('model')), 'success'); - return redirect()->route('get-trash'); } } diff --git a/app/Http/Controllers/App/UserSettingsController.php b/app/Http/Controllers/App/UserSettingsController.php index a267d9ef..acae4445 100644 --- a/app/Http/Controllers/App/UserSettingsController.php +++ b/app/Http/Controllers/App/UserSettingsController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\App; +use App\Actions\Fortify\UpdateUserPassword; +use App\Actions\Fortify\UpdateUserProfileInformation; use App\Helper\LinkAce; use App\Http\Controllers\Controller; use App\Http\Requests\UserAccountUpdateRequest; @@ -11,10 +13,8 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class UserSettingsController extends Controller { @@ -36,23 +36,19 @@ public function getUserSettings(): View /** * Handles changes of the user account itself. * - * @param UserAccountUpdateRequest $request + * @param Request $request * @return RedirectResponse */ - public function saveAccountSettings(UserAccountUpdateRequest $request): RedirectResponse + public function saveAccountSettings(Request $request): RedirectResponse { - $request->user()->update($request->only([ - 'name', - 'email', - ])); + (new UpdateUserProfileInformation())->update($request->user(), $request->input()); flash(trans('settings.settings_saved'), 'success'); - return redirect()->back(); } /** - * Handle changes of generall application settings like share services. + * Handle changes of general application settings like share services. * * @param UserSettingsUpdateRequest $request * @return RedirectResponse @@ -88,36 +84,20 @@ public function saveAppSettings(UserSettingsUpdateRequest $request): RedirectRes } flash(trans('settings.settings_saved'), 'success'); - return redirect()->back(); } /** * Handles the user password change. * - * @param UserPasswordUpdateRequest $request + * @param Request $request * @return RedirectResponse */ - public function changeUserPassword(UserPasswordUpdateRequest $request): RedirectResponse + public function changeUserPassword(Request $request): RedirectResponse { - $currentUser = $request->user(); - - $authorizationSuccessful = Auth::attempt([ - 'email' => $currentUser->email, - 'password' => $request->input('old_password'), - ]); - - if (!$authorizationSuccessful) { - flash(trans('settings.old_password_invalid')); - - return redirect()->back()->withInput(); - } - - $currentUser->password = Hash::make($request->input('new_password')); - $currentUser->save(); + (new UpdateUserPassword())->update($request->user(), $request->input()); flash(trans('settings.password_updated'), 'success'); - return redirect()->back(); } diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php deleted file mode 100644 index 6a247fef..00000000 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ /dev/null @@ -1,32 +0,0 @@ -middleware('guest'); - } -} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php deleted file mode 100644 index 0d213f01..00000000 --- a/app/Http/Controllers/Auth/LoginController.php +++ /dev/null @@ -1,51 +0,0 @@ -remove('bookmarklet.login_redirect'); - return route('bookmarklet-add', [ - 'u' => session('bookmarklet.new_url'), - 't' => session('bookmarklet.new_title'), - ]); - } - - return '/dashboard'; - } - - /** - * Create a new controller instance. - * - * @return void - */ - public function __construct() - { - $this->middleware('guest')->except('logout'); - } -} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php deleted file mode 100644 index cedeff8d..00000000 --- a/app/Http/Controllers/Auth/RegisterController.php +++ /dev/null @@ -1,63 +0,0 @@ -middleware('guest'); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return Validator - */ - protected function validator(array $data): Validator - { - return User::validateRegistration($data); - } - - /** - * Create a new user instance after a valid registration. - * - * @param array $data - * @return User - */ - protected function create(array $data): User - { - return User::createUser($data); - } -} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php deleted file mode 100644 index 1d99752a..00000000 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ /dev/null @@ -1,39 +0,0 @@ -middleware('guest'); - } -} diff --git a/app/Http/Controllers/FrontController.php b/app/Http/Controllers/FrontController.php index b7ecb351..f098cdf1 100644 --- a/app/Http/Controllers/FrontController.php +++ b/app/Http/Controllers/FrontController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers; use Illuminate\Http\RedirectResponse; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class FrontController extends Controller { diff --git a/app/Http/Controllers/Guest/LinkController.php b/app/Http/Controllers/Guest/LinkController.php index 3ab26069..9311f09e 100644 --- a/app/Http/Controllers/Guest/LinkController.php +++ b/app/Http/Controllers/Guest/LinkController.php @@ -4,8 +4,8 @@ use App\Http\Controllers\Controller; use App\Models\Link; +use Illuminate\Contracts\View\View; use Illuminate\Http\Request; -use Illuminate\View\View; class LinkController extends Controller { diff --git a/app/Http/Controllers/Guest/ListController.php b/app/Http/Controllers/Guest/ListController.php index 60101e64..c4c2c84e 100644 --- a/app/Http/Controllers/Guest/ListController.php +++ b/app/Http/Controllers/Guest/ListController.php @@ -4,8 +4,8 @@ use App\Http\Controllers\Controller; use App\Models\LinkList; +use Illuminate\Contracts\View\View; use Illuminate\Http\Request; -use Illuminate\View\View; class ListController extends Controller { @@ -36,12 +36,12 @@ public function index(Request $request): View * Display the specified resource. * * @param Request $request - * @param int $id + * @param int $listID * @return View */ - public function show(Request $request, $id): View + public function show(Request $request, $listID): View { - $list = LinkList::isPrivate(false)->findOrFail($id); + $list = LinkList::isPrivate(false)->findOrFail($listID); $links = $list->links() ->privateOnly(false) diff --git a/app/Http/Controllers/Guest/TagController.php b/app/Http/Controllers/Guest/TagController.php index ed0d397c..9d603a71 100644 --- a/app/Http/Controllers/Guest/TagController.php +++ b/app/Http/Controllers/Guest/TagController.php @@ -3,10 +3,9 @@ namespace App\Http\Controllers\Guest; use App\Http\Controllers\Controller; -use App\Models\LinkList; use App\Models\Tag; +use Illuminate\Contracts\View\View; use Illuminate\Http\Request; -use Illuminate\View\View; class TagController extends Controller { @@ -38,12 +37,12 @@ public function index(Request $request): View * Display the specified resource. * * @param Request $request - * @param int $id + * @param int $tagID * @return View */ - public function show(Request $request, $id): View + public function show(Request $request, $tagID): View { - $tag = Tag::isPrivate(false)->findOrFail($id); + $tag = Tag::isPrivate(false)->findOrFail($tagID); $links = $tag->links() ->privateOnly(false) diff --git a/app/Http/Controllers/Models/LinkController.php b/app/Http/Controllers/Models/LinkController.php index 84fce969..57e6ed11 100644 --- a/app/Http/Controllers/Models/LinkController.php +++ b/app/Http/Controllers/Models/LinkController.php @@ -3,16 +3,15 @@ namespace App\Http\Controllers\Models; use App\Http\Controllers\Controller; -use App\Http\Requests\Models\LinkDeleteRequest; use App\Http\Requests\Models\LinkStoreRequest; use App\Http\Requests\Models\LinkToggleCheckRequest; use App\Http\Requests\Models\LinkUpdateRequest; use App\Models\Link; use App\Repositories\LinkRepository; use Exception; +use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\View\View; class LinkController extends Controller { @@ -94,13 +93,11 @@ public function store(LinkStoreRequest $request): RedirectResponse /** * Display the specified resource. * - * @param int $id + * @param Link $link * @return View */ - public function show($id): View + public function show(Link $link): View { - $link = Link::findOrFail($id); - return view('models.links.show', [ 'link' => $link, 'history' => $link->revisionHistory()->latest()->get(), @@ -110,29 +107,26 @@ public function show($id): View /** * Show the form for editing the specified resource. * - * @param int $id + * @param Link $link * @return View */ - public function edit($id): View + public function edit(Link $link): View { - $link = Link::findOrFail($id); - - return view('models.links.edit') - ->with('link', $link); + return view('models.links.edit', [ + 'link' => $link, + ]); } /** * Update the specified resource in storage. * * @param LinkUpdateRequest $request - * @param int $id + * @param Link $link * @return RedirectResponse */ - public function update(LinkUpdateRequest $request, $id): RedirectResponse + public function update(LinkUpdateRequest $request, Link $link): RedirectResponse { - $link = Link::findOrFail($id); - - $link = LinkRepository::update($link, $request->all()); + $link = LinkRepository::update($link, $request->input()); flash(trans('link.updated_successfully'), 'success'); return redirect()->route('links.show', [$link->id]); @@ -141,18 +135,15 @@ public function update(LinkUpdateRequest $request, $id): RedirectResponse /** * Remove the specified resource from storage. * - * @param LinkDeleteRequest $request - * @param int $id + * @param Link $link * @return RedirectResponse * @throws Exception */ - public function destroy(LinkDeleteRequest $request, $id): RedirectResponse + public function destroy(Link $link): RedirectResponse { - $link = Link::findOrFail($id); - - $deletionSuccessfull = LinkRepository::delete($link); + $deletionSuccessful = LinkRepository::delete($link); - if (!$deletionSuccessfull) { + if (!$deletionSuccessful) { flash(trans('link.deletion_error'), 'error'); return redirect()->back(); } @@ -165,13 +156,11 @@ public function destroy(LinkDeleteRequest $request, $id): RedirectResponse * Toggles the setting of a link to be either checked or not. * * @param LinkToggleCheckRequest $request - * @param $id + * @param Link $link * @return RedirectResponse */ - public function updateCheckToggle(LinkToggleCheckRequest $request, $id): RedirectResponse + public function updateCheckToggle(LinkToggleCheckRequest $request, Link $link): RedirectResponse { - $link = Link::findOrFail($id); - $link->check_disabled = $request->input('toggle'); $link->save(); diff --git a/app/Http/Controllers/Models/ListController.php b/app/Http/Controllers/Models/ListController.php index d58353da..35163c7a 100644 --- a/app/Http/Controllers/Models/ListController.php +++ b/app/Http/Controllers/Models/ListController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Models; use App\Http\Controllers\Controller; -use App\Http\Requests\Models\ListDeleteRequest; use App\Http\Requests\Models\ListStoreRequest; use App\Http\Requests\Models\ListUpdateRequest; use App\Models\LinkList; @@ -11,7 +10,7 @@ use Exception; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\View\View; +use \Illuminate\Contracts\View\View; class ListController extends Controller { @@ -74,14 +73,12 @@ public function store(ListStoreRequest $request): RedirectResponse /** * Display the specified resource. * - * @param Request $request - * @param int $id + * @param Request $request + * @param LinkList $list * @return View */ - public function show(Request $request, $id): View + public function show(Request $request, LinkList $list): View { - $list = LinkList::findOrFail($id); - $links = $list->links() ->byUser(auth()->id()) ->orderBy( @@ -101,27 +98,23 @@ public function show(Request $request, $id): View /** * Show the form for editing the specified resource. * - * @param int $id + * @param LinkList $list * @return View */ - public function edit($id): View + public function edit(LinkList $list): View { - $list = LinkList::findOrFail($id); - - return view('models.lists.edit')->with('list', $list); + return view('models.lists.edit', ['list' => $list]); } /** * Update the specified resource in storage. * * @param ListUpdateRequest $request - * @param int $id + * @param LinkList $list * @return RedirectResponse */ - public function update(ListUpdateRequest $request, $id): RedirectResponse + public function update(ListUpdateRequest $request, LinkList $list): RedirectResponse { - $list = LinkList::findOrFail($id); - $list = ListRepository::update($list, $request->all()); flash(trans('list.updated_successfully'), 'success'); @@ -131,18 +124,15 @@ public function update(ListUpdateRequest $request, $id): RedirectResponse /** * Remove the specified resource from storage. * - * @param ListDeleteRequest $request - * @param int $id + * @param LinkList $list * @return RedirectResponse * @throws Exception */ - public function destroy(ListDeleteRequest $request, $id): RedirectResponse + public function destroy(LinkList $list): RedirectResponse { - $list = LinkList::findOrFail($id); - - $deletionSuccessfull = ListRepository::delete($list); + $deletionSuccessful = ListRepository::delete($list); - if (!$deletionSuccessfull) { + if (!$deletionSuccessful) { flash(trans('list.deletion_error'), 'error'); return redirect()->back(); } diff --git a/app/Http/Controllers/Models/NoteController.php b/app/Http/Controllers/Models/NoteController.php index 0a20725d..bda81d43 100644 --- a/app/Http/Controllers/Models/NoteController.php +++ b/app/Http/Controllers/Models/NoteController.php @@ -10,8 +10,8 @@ use App\Models\Note; use App\Repositories\NoteRepository; use Exception; +use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; -use Illuminate\View\View; class NoteController extends Controller { @@ -40,31 +40,27 @@ public function store(NoteStoreRequest $request): RedirectResponse /** * Show the form for editing the specified resource. * - * @param int $id + * @param Note $note * @return View */ - public function edit($id): View + public function edit(Note $note): View { - $note = Note::findOrFail($id); - if ($note->user_id !== auth()->id()) { abort(403); } - return view('models.notes.edit')->with('note', $note); + return view('models.notes.edit', ['note' => $note]); } /** * Update the specified resource in storage. * * @param NoteUpdateRequest $request - * @param int $id + * @param Note $note * @return RedirectResponse */ - public function update(NoteUpdateRequest $request, $id): RedirectResponse + public function update(NoteUpdateRequest $request, Note $note): RedirectResponse { - $note = Note::findOrFail($id); - $note = NoteRepository::update($note, $request->except(['_token'])); flash(trans('note.updated_successfully'), 'success'); @@ -75,20 +71,17 @@ public function update(NoteUpdateRequest $request, $id): RedirectResponse /** * Remove the specified resource from storage. * - * @param NoteDeleteRequest $request - * @param int $id + * @param Note $note * @return RedirectResponse * @throws Exception */ - public function destroy(NoteDeleteRequest $request, $id): RedirectResponse + public function destroy(Note $note): RedirectResponse { - $note = Note::findOrFail($id); - $linkId = $note->link->id; - $deletionSuccessfull = NoteRepository::delete($note); + $deletionSuccessful = NoteRepository::delete($note); - if (!$deletionSuccessfull) { + if (!$deletionSuccessful) { flash(trans('note.deletion_error'), 'error'); return redirect()->back(); } diff --git a/app/Http/Controllers/Models/TagController.php b/app/Http/Controllers/Models/TagController.php index 036d6fa5..e14fdfe9 100644 --- a/app/Http/Controllers/Models/TagController.php +++ b/app/Http/Controllers/Models/TagController.php @@ -3,15 +3,14 @@ namespace App\Http\Controllers\Models; use App\Http\Controllers\Controller; -use App\Http\Requests\Models\TagDeleteRequest; use App\Http\Requests\Models\TagStoreRequest; use App\Http\Requests\Models\TagUpdateRequest; use App\Models\Tag; use App\Repositories\TagRepository; use Exception; +use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\View\View; class TagController extends Controller { @@ -74,13 +73,11 @@ public function store(TagStoreRequest $request) * Display the specified resource. * * @param Request $request - * @param int $id + * @param Tag $tag * @return View */ - public function show(Request $request, $id): View + public function show(Request $request, Tag $tag): View { - $tag = Tag::findOrFail($id); - $links = $tag->links()->byUser(auth()->id()) ->orderBy( $request->input('orderBy', 'created_at'), @@ -100,29 +97,24 @@ public function show(Request $request, $id): View /** * Show the form for editing the specified resource. * - * @param int $id + * @param Tag $tag * @return View */ - public function edit($id): View + public function edit(Tag $tag): View { - $tag = Tag::findOrFail($id); - - return view('models.tags.edit')->with('tag', $tag); + return view('models.tags.edit', ['tag' => $tag]); } /** * Update the specified resource in storage. * * @param TagUpdateRequest $request - * @param int $id + * @param Tag $tag * @return RedirectResponse */ - public function update(TagUpdateRequest $request, $id): RedirectResponse + public function update(TagUpdateRequest $request, Tag $tag): RedirectResponse { - $tag = Tag::findOrFail($id); - - $data = $request->all(); - $tag = TagRepository::update($tag, $data); + $tag = TagRepository::update($tag, $request->input()); flash(trans('tag.updated_successfully'), 'success'); return redirect()->route('tags.show', [$tag->id]); @@ -131,18 +123,15 @@ public function update(TagUpdateRequest $request, $id): RedirectResponse /** * Remove the specified resource from storage. * - * @param TagDeleteRequest $request - * @param int $id + * @param Tag $tag * @return RedirectResponse * @throws Exception */ - public function destroy(TagDeleteRequest $request, $id): RedirectResponse + public function destroy(Tag $tag): RedirectResponse { - $tag = Tag::findOrFail($id); - - $deletionSuccessfull = TagRepository::delete($tag); + $deletionSuccessful = TagRepository::delete($tag); - if (!$deletionSuccessfull) { + if (!$deletionSuccessful) { flash(trans('tag.deletion_error'), 'error'); return redirect()->back(); } diff --git a/app/Http/Controllers/Setup/AccountController.php b/app/Http/Controllers/Setup/AccountController.php index 05f3f9c8..0c5614aa 100644 --- a/app/Http/Controllers/Setup/AccountController.php +++ b/app/Http/Controllers/Setup/AccountController.php @@ -2,16 +2,15 @@ namespace App\Http\Controllers\Setup; +use App\Actions\Fortify\CreateNewUser; use App\Http\Controllers\Controller; -use App\Models\User; -use Illuminate\Contracts\Validation\Validator; -use Illuminate\Foundation\Auth\RegistersUsers; -use Illuminate\View\View; +use Illuminate\Http\RedirectResponse; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Illuminate\Contracts\View\View; class AccountController extends Controller { - use RegistersUsers; - protected function redirectTo(): string { return route('setup.complete'); @@ -28,20 +27,17 @@ public function index(): View } /** - * @param array $data - * @return Validator + * Validate and create the new user, then login him, and redirect him to the dashboard + * + * @param Request $request + * @return RedirectResponse */ - protected function validator(array $data): Validator + protected function register(Request $request): RedirectResponse { - return User::validateRegistration($data); - } + $user = (new CreateNewUser())->create($request->input()); - /** - * @param array $data - * @return User - */ - protected function create(array $data): User - { - return User::createUser($data); + Auth::login($user, true); + + return redirect()->route('dashboard'); } } diff --git a/app/Http/Controllers/Setup/DatabaseController.php b/app/Http/Controllers/Setup/DatabaseController.php index c8afcd1c..e3877af4 100644 --- a/app/Http/Controllers/Setup/DatabaseController.php +++ b/app/Http/Controllers/Setup/DatabaseController.php @@ -12,7 +12,7 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Log; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; use PDOException; class DatabaseController extends Controller @@ -42,7 +42,6 @@ public function configure(SetupDatabaseRequest $request): RedirectResponse if ($this->databaseHasData() && !$request->has('overwrite_data')) { flash(trans('setup.database.data_present'), 'danger'); - return redirect()->back()->with('data_present', true)->withInput(); } diff --git a/app/Http/Controllers/Setup/MetaController.php b/app/Http/Controllers/Setup/MetaController.php index 6e8f6314..b304a8e9 100644 --- a/app/Http/Controllers/Setup/MetaController.php +++ b/app/Http/Controllers/Setup/MetaController.php @@ -4,7 +4,7 @@ use App\Http\Controllers\Controller; use Illuminate\Support\Facades\File; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class MetaController extends Controller { diff --git a/app/Http/Controllers/Setup/RequirementsController.php b/app/Http/Controllers/Setup/RequirementsController.php index f32fe45c..e5e977ea 100644 --- a/app/Http/Controllers/Setup/RequirementsController.php +++ b/app/Http/Controllers/Setup/RequirementsController.php @@ -4,7 +4,7 @@ use App\Http\Controllers\Controller; use Illuminate\Support\Facades\File; -use Illuminate\View\View; +use Illuminate\Contracts\View\View; class RequirementsController extends Controller { diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index a05d3795..92fb7942 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -37,6 +37,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\SettingsMiddleware::class, + \App\Http\Middleware\BookmarkRedirectMiddleware::class, ], 'api' => [ @@ -60,6 +61,7 @@ class Kernel extends HttpKernel 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'guestaccess' => \App\Http\Middleware\GuestAccess::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; diff --git a/app/Http/Middleware/BookmarkRedirectMiddleware.php b/app/Http/Middleware/BookmarkRedirectMiddleware.php new file mode 100644 index 00000000..1e86bac6 --- /dev/null +++ b/app/Http/Middleware/BookmarkRedirectMiddleware.php @@ -0,0 +1,34 @@ +is('dashboard')) { + Session::forget('bookmarklet.login_redirect'); + + return redirect()->route('bookmarklet-add', [ + 'u' => session('bookmarklet.new_url'), + 't' => session('bookmarklet.new_title'), + ]); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index b1940924..7617761e 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -4,6 +4,7 @@ use Closure; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; class RedirectIfAuthenticated { diff --git a/app/Http/Requests/Models/LinkDeleteRequest.php b/app/Http/Requests/Models/LinkDeleteRequest.php deleted file mode 100644 index 38ddcce2..00000000 --- a/app/Http/Requests/Models/LinkDeleteRequest.php +++ /dev/null @@ -1,33 +0,0 @@ -input('url') !== null) { - $this->requireUniqueUrl = Link::urlHasChanged( - $request->route('link'), - $request->input('url') - ); + $this->requireUniqueUrl = $request->route('link')->url !== $request->input('url'); } return true; diff --git a/app/Http/Requests/Models/ListDeleteRequest.php b/app/Http/Requests/Models/ListDeleteRequest.php deleted file mode 100644 index 9a68ba11..00000000 --- a/app/Http/Requests/Models/ListDeleteRequest.php +++ /dev/null @@ -1,35 +0,0 @@ -input('name') !== null) { - $this->requireUniqueName = LinkList::nameHasChanged( - $request->route('list'), - $request->input('name') - ); + $this->requireUniqueName = $request->route('list')->name !== $request->input('name'); } return true; diff --git a/app/Http/Requests/Models/NoteDeleteRequest.php b/app/Http/Requests/Models/NoteDeleteRequest.php deleted file mode 100644 index 8e5d1182..00000000 --- a/app/Http/Requests/Models/NoteDeleteRequest.php +++ /dev/null @@ -1,35 +0,0 @@ -input('name') !== null) { - $this->requireUniqueName = Tag::nameHasChanged( - $request->route('tag'), - $request->input('name') - ); + $this->requireUniqueName = $request->route('tag')->name !== $request->input('name'); } return true; diff --git a/app/Http/Requests/UserAccountUpdateRequest.php b/app/Http/Requests/UserAccountUpdateRequest.php deleted file mode 100644 index ed2f242e..00000000 --- a/app/Http/Requests/UserAccountUpdateRequest.php +++ /dev/null @@ -1,58 +0,0 @@ -input('name') !== auth()->user()->name) { - $this->validate_username = true; - } - - // Validate the email address if it was changed - if ($request->input('email') !== auth()->user()->email) { - $this->validate_email = true; - } - - return true; - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - if ($this->validate_username) { - $rules['name'] = 'unique:users,name'; - } - - if ($this->validate_email) { - $rules['email'] = 'unique:users,email'; - } - - return $rules ?? []; - } -} diff --git a/app/Http/Requests/UserPasswordUpdateRequest.php b/app/Http/Requests/UserPasswordUpdateRequest.php deleted file mode 100644 index d9c1e85c..00000000 --- a/app/Http/Requests/UserPasswordUpdateRequest.php +++ /dev/null @@ -1,36 +0,0 @@ - 'required', - 'new_password' => 'required|min:10|confirmed', - ]; - } -} diff --git a/app/Models/Link.php b/app/Models/Link.php index 25a7f4af..f4f93558 100644 --- a/app/Models/Link.php +++ b/app/Models/Link.php @@ -232,13 +232,13 @@ public function getIcon(string $additionalClasses = ''): string if ($this->status === self::STATUS_MOVED) { $icon = 'external-link'; $additionalClasses .= ' text-warning'; - $title = trans('link.status.2'); + $title = trans('link.stati.2'); } if ($this->status === self::STATUS_BROKEN) { $icon = 'unlink'; $additionalClasses .= ' text-danger'; - $title = trans('link.status.3'); + $title = trans('link.stati.3'); } if (!view()->exists('components.icon.' . $icon)) { @@ -268,17 +268,6 @@ public function addedAt() return $output; } - /** - * @param string|int $linkId - * @param string $newUrl - * @return bool - */ - public static function urlHasChanged($linkId, string $newUrl): bool - { - $oldUrl = self::find($linkId)->url ?? null; - return $oldUrl !== $newUrl; - } - /* * Dispatch the SaveLinkToWaybackmachine job, if Internet Archive backups * are enabled. diff --git a/app/Models/User.php b/app/Models/User.php index f2b15dea..dc18ef56 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,13 +3,11 @@ namespace App\Models; use Carbon\Carbon; -use Illuminate\Contracts\Validation\Validator as ValidatorContract; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; -use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\Validator; +use Laravel\Fortify\TwoFactorAuthenticatable; /** * Class User @@ -21,6 +19,8 @@ * @property string $password * @property string|null $remember_token * @property string|null $api_token + * @property string|null $two_factor_recovery_codes + * @property string|null $two_factor_secret * @property Carbon|null $created_at * @property Carbon|null $updated_at */ @@ -28,6 +28,7 @@ class User extends Authenticatable { use Notifiable; use HasFactory; + use TwoFactorAuthenticatable; protected $fillable = [ 'name', @@ -41,24 +42,6 @@ class User extends Authenticatable 'remember_token', ]; - public static function validateRegistration(array $data): ValidatorContract - { - return Validator::make($data, [ - 'name' => 'required|string|max:255', - 'email' => 'required|string|email|max:255|unique:users', - 'password' => 'required|string|min:10|confirmed', - ]); - } - - public static function createUser(array $data): self - { - return self::create([ - 'name' => $data['name'], - 'email' => $data['email'], - 'password' => Hash::make($data['password']), - ]); - } - /* | ======================================================================== | RELATIONSHIPS diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php new file mode 100644 index 00000000..14e5cfb9 --- /dev/null +++ b/app/Providers/FortifyServiceProvider.php @@ -0,0 +1,56 @@ +component = $component; - } - - /** - * Get the view / contents that represent the component. - * - * @return View|string - */ - public function render() - { - if (!view()->exists('components.' . $this->component)) { - return ""; - } - - return view('components.' . $this->component, ['attributes' => $this->attributes]); - } -} diff --git a/app/View/Components/Links/HistoryEntry.php b/app/View/Components/Links/HistoryEntry.php index 508173b6..beada94f 100644 --- a/app/View/Components/Links/HistoryEntry.php +++ b/app/View/Components/Links/HistoryEntry.php @@ -102,6 +102,10 @@ protected function processValues() return $this->processPrivateField($oldValue, $newValue); } + if ($this->entry->fieldName() === 'status') { + return $this->processStatusField($oldValue, $newValue); + } + return [$this->entry->oldValue(), $this->entry->newValue()]; } @@ -167,6 +171,22 @@ protected function processPrivateField($oldValue, $newValue): array return [$oldValue, $newValue]; } + /** + * The Status field is a mapped constant field, thus needs to be formatted with + * the correct translated values. + * + * @param $oldValue + * @param $newValue + * @return array + */ + protected function processStatusField($oldValue, $newValue): array + { + $oldValue = trans('link.stati.' . $oldValue); + $newValue = trans('link.stati.' . $newValue); + + return [$oldValue, $newValue]; + } + /** * The deleted field displays its own string based on whether the link * was deleted or restored. diff --git a/composer.json b/composer.json index 6fb6306c..17c44d74 100644 --- a/composer.json +++ b/composer.json @@ -10,10 +10,12 @@ "fideloper/proxy": "^4.0", "guzzlehttp/guzzle": "^7.0.1", "laracasts/flash": "^3.1", + "laravel/fortify": "^1.7", "laravel/framework": "^8.0", - "laravel/ui": "^3.0", "league/csv": "^9.6", + "league/flysystem-aws-s3-v3": "^1.0", "predis/predis": "^1.1", + "rap2hpoutre/laravel-log-viewer": "^1.7", "shaarli/netscape-bookmark-parser": "^2.1", "spatie/laravel-backup": "^6.11.1", "venturecraft/revisionable": "^1.34" @@ -62,7 +64,7 @@ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], - "lint": "./vendor/bin/phpcs", + "lint": "./vendor/bin/phpcs --runtime-set ignore_warnings_on_exit 1", "test": "./vendor/bin/phpunit", "code-coverage": "./vendor/bin/phpunit --coverage-clover test-coverage.xml" }, diff --git a/composer.lock b/composer.lock index 87e459a9..bbd5f054 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,142 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "885bd4615d6394c87ffa558cc49c0b1a", + "content-hash": "7813e50f9489a043cfe6645ef4dc3435", "packages": [ + { + "name": "aws/aws-sdk-php", + "version": "3.161.2", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "2703896142f292058ce9d6c9026a9329a89778e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2703896142f292058ce9d6c9026a9329a89778e0", + "reference": "2703896142f292058ce9d6c9026a9329a89778e0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4.1", + "mtdowling/jmespath.php": "^2.5", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^4.8.35|^5.4.3", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Aws\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "time": "2020-11-16T19:11:59+00:00" + }, + { + "name": "bacon/bacon-qr-code", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "3e9d791b67d0a2912922b7b7c7312f4b37af41e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/3e9d791b67d0a2912922b7b7c7312f4b37af41e4", + "reference": "3e9d791b67d0a2912922b7b7c7312f4b37af41e4", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^1.4", + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "time": "2020-10-30T02:02:47+00:00" + }, { "name": "brick/math", "version": "0.9.1", @@ -133,6 +267,49 @@ ], "time": "2020-09-27T13:13:07+00:00" }, + { + "name": "dasprid/enum", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "time": "2020-10-02T16:03:48+00:00" + }, { "name": "doctrine/cache", "version": "1.10.2", @@ -231,16 +408,16 @@ }, { "name": "doctrine/dbal", - "version": "2.12.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646" + "reference": "adce7a954a1c2f14f85e94aed90c8489af204086" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6d37b4c42aaa3c3ee175f05eca68056f4185646", - "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086", + "reference": "adce7a954a1c2f14f85e94aed90c8489af204086", "shasum": "" }, "require": { @@ -334,7 +511,7 @@ "type": "tidelift" } ], - "time": "2020-10-22T17:26:24+00:00" + "time": "2020-11-14T20:26:58+00:00" }, { "name": "doctrine/event-manager", @@ -649,16 +826,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.23", + "version": "2.1.24", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "5fa792ad1853ae2bc60528dd3e5cbf4542d3c1df" + "reference": "ca90a3291eee1538cd48ff25163240695bd95448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/5fa792ad1853ae2bc60528dd3e5cbf4542d3c1df", - "reference": "5fa792ad1853ae2bc60528dd3e5cbf4542d3c1df", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ca90a3291eee1538cd48ff25163240695bd95448", + "reference": "ca90a3291eee1538cd48ff25163240695bd95448", "shasum": "" }, "require": { @@ -703,7 +880,13 @@ "validation", "validator" ], - "time": "2020-10-31T20:37:35+00:00" + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-11-14T15:56:27+00:00" }, { "name": "fideloper/proxy", @@ -1145,18 +1328,77 @@ "description": "Easy flash notifications", "time": "2020-09-07T13:25:35+00:00" }, + { + "name": "laravel/fortify", + "version": "v1.7.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/fortify.git", + "reference": "b2430958fa93883ab0e5f0caf486ef3688711608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/fortify/zipball/b2430958fa93883ab0e5f0caf486ef3688711608", + "reference": "b2430958fa93883ab0e5f0caf486ef3688711608", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0", + "ext-json": "*", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "pragmarx/google2fa": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Fortify\\FortifyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Fortify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Backend controllers and scaffolding for Laravel authentication.", + "keywords": [ + "auth", + "laravel" + ], + "time": "2020-11-13T13:55:54+00:00" + }, { "name": "laravel/framework", - "version": "v8.13.0", + "version": "v8.15.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "37a0abd4f3dbc51e2256296b45f8be72c8fe2196" + "reference": "22e4182fa0885dea3772106c3b6df705b7c7363e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/37a0abd4f3dbc51e2256296b45f8be72c8fe2196", - "reference": "37a0abd4f3dbc51e2256296b45f8be72c8fe2196", + "url": "https://api.github.com/repos/laravel/framework/zipball/22e4182fa0885dea3772106c3b6df705b7c7363e", + "reference": "22e4182fa0885dea3772106c3b6df705b7c7363e", "shasum": "" }, "require": { @@ -1230,7 +1472,7 @@ }, "require-dev": { "aws/aws-sdk-php": "^3.0", - "doctrine/dbal": "^2.6", + "doctrine/dbal": "^2.6|^3.0", "filp/whoops": "^2.8", "guzzlehttp/guzzle": "^6.5.5|^7.0.1", "league/flysystem-cached-adapter": "^1.0", @@ -1243,7 +1485,7 @@ }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).", "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", @@ -1306,61 +1548,7 @@ "framework", "laravel" ], - "time": "2020-11-03T14:13:19+00:00" - }, - { - "name": "laravel/ui", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/ui.git", - "reference": "444072cb2f8baaa15172c5cde2bd30d188c3b7e7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/444072cb2f8baaa15172c5cde2bd30d188c3b7e7", - "reference": "444072cb2f8baaa15172c5cde2bd30d188c3b7e7", - "shasum": "" - }, - "require": { - "illuminate/console": "^8.0", - "illuminate/filesystem": "^8.0", - "illuminate/support": "^8.0", - "php": "^7.3|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - }, - "laravel": { - "providers": [ - "Laravel\\Ui\\UiServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Ui\\": "src/", - "Illuminate\\Foundation\\Auth\\": "auth-backend/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel UI utilities and presets.", - "keywords": [ - "laravel", - "ui" - ], - "time": "2020-11-03T19:51:21+00:00" + "time": "2020-11-17T14:53:20+00:00" }, { "name": "league/commonmark", @@ -1626,6 +1814,53 @@ ], "time": "2020-08-23T07:39:11+00:00" }, + { + "name": "league/flysystem-aws-s3-v3", + "version": "1.0.29", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "4e25cc0582a36a786c31115e419c6e40498f6972" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4e25cc0582a36a786c31115e419c6e40498f6972", + "reference": "4e25cc0582a36a786c31115e419c6e40498f6972", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "^3.20.0", + "league/flysystem": "^1.0.40", + "php": ">=5.5.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\AwsS3v3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Flysystem adapter for the AWS S3 SDK v3.x", + "time": "2020-10-08T18:58:37+00:00" + }, { "name": "league/mime-type-detection", "version": "1.5.1", @@ -1768,6 +2003,63 @@ ], "time": "2020-07-23T08:41:23+00:00" }, + { + "name": "mtdowling/jmespath.php", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^1.4", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "JmesPath\\": "src/" + }, + "files": [ + "src/JmesPath.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "time": "2020-07-31T21:01:56+00:00" + }, { "name": "nesbot/carbon", "version": "2.41.5", @@ -1918,6 +2210,68 @@ ], "time": "2020-11-07T02:01:34+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2", + "reference": "47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7", + "vimeo/psalm": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "time": "2019-11-06T19:20:29+00:00" + }, { "name": "phpoption/phpoption", "version": "1.7.5", @@ -1983,6 +2337,54 @@ ], "time": "2020-07-20T17:29:33+00:00" }, + { + "name": "pragmarx/google2fa", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/26c4c5cf30a2844ba121760fd7301f8ad240100b", + "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "time": "2020-04-05T10:47:18+00:00" + }, { "name": "predis/predis", "version": "v1.1.6", @@ -2543,6 +2945,65 @@ ], "time": "2020-08-18T17:17:46+00:00" }, + { + "name": "rap2hpoutre/laravel-log-viewer", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/rap2hpoutre/laravel-log-viewer.git", + "reference": "27392d29234b6ff38a456454558f4bcc40cc837a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rap2hpoutre/laravel-log-viewer/zipball/27392d29234b6ff38a456454558f4bcc40cc837a", + "reference": "27392d29234b6ff38a456454558f4bcc40cc837a", + "shasum": "" + }, + "require": { + "illuminate/support": "4.2.*|5.*|^6.0|^7.0|^8.0", + "php": ">=5.4.0" + }, + "require-dev": { + "orchestra/testbench": "3.7.*", + "phpunit/phpunit": "^7" + }, + "type": "laravel-package", + "extra": { + "laravel": { + "providers": [ + "Rap2hpoutre\\LaravelLogViewer\\LaravelLogViewerServiceProvider" + ] + } + }, + "autoload": { + "classmap": [ + "src/controllers" + ], + "psr-0": { + "Rap2hpoutre\\LaravelLogViewer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "rap2hpoutre", + "email": "raphaelht@gmail.com" + } + ], + "description": "A Laravel log reader", + "keywords": [ + "laravel", + "log", + "log-reader", + "log-viewer", + "logging", + "lumen" + ], + "time": "2020-09-08T12:21:27+00:00" + }, { "name": "shaarli/netscape-bookmark-parser", "version": "v2.2.0", @@ -2600,24 +3061,24 @@ }, { "name": "spatie/db-dumper", - "version": "2.17.0", + "version": "2.18.0", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "d23bcb566443e862a8dbb6dbd5e8da03aaf98e2a" + "reference": "eddb2b7c6877817d97bbdc1c60d1a800bf5a267a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/d23bcb566443e862a8dbb6dbd5e8da03aaf98e2a", - "reference": "d23bcb566443e862a8dbb6dbd5e8da03aaf98e2a", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/eddb2b7c6877817d97bbdc1c60d1a800bf5a267a", + "reference": "eddb2b7c6877817d97bbdc1c60d1a800bf5a267a", "shasum": "" }, "require": { - "php": "^7.2", + "php": "^7.2|^8.0", "symfony/process": "^4.2|^5.0" }, "require-dev": { - "phpunit/phpunit": "^7.0|^8.0" + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", "autoload": { @@ -2652,7 +3113,7 @@ "type": "github" } ], - "time": "2020-09-10T14:52:52+00:00" + "time": "2020-11-10T09:20:18+00:00" }, { "name": "spatie/laravel-backup", @@ -2742,23 +3203,23 @@ }, { "name": "spatie/temporary-directory", - "version": "1.2.4", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/spatie/temporary-directory.git", - "reference": "8efe8e61e0ca943d84341f10e51ef3a9606af932" + "reference": "f517729b3793bca58f847c5fd383ec16f03ffec6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/8efe8e61e0ca943d84341f10e51ef3a9606af932", - "reference": "8efe8e61e0ca943d84341f10e51ef3a9606af932", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/f517729b3793bca58f847c5fd383ec16f03ffec6", + "reference": "f517729b3793bca58f847c5fd383ec16f03ffec6", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2|^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^8.0|^9.0" }, "type": "library", "autoload": { @@ -2781,10 +3242,11 @@ "description": "Easily create, use and destroy temporary directories", "homepage": "https://github.com/spatie/temporary-directory", "keywords": [ + "php", "spatie", "temporary-directory" ], - "time": "2020-09-07T20:41:15+00:00" + "time": "2020-11-09T15:54:21+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -5109,23 +5571,23 @@ }, { "name": "voku/portable-ascii", - "version": "1.5.3", + "version": "1.5.6", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "25bcbf01678930251fd572891447d9e318a6e2b8" + "reference": "80953678b19901e5165c56752d087fc11526017c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/25bcbf01678930251fd572891447d9e318a6e2b8", - "reference": "25bcbf01678930251fd572891447d9e318a6e2b8", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", "shasum": "" }, "require": { "php": ">=7.0.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0" + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" }, "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" @@ -5175,7 +5637,7 @@ "type": "tidelift" } ], - "time": "2020-07-22T23:32:04+00:00" + "time": "2020-11-12T00:07:28+00:00" } ], "packages-dev": [ @@ -5625,16 +6087,16 @@ }, { "name": "composer/xdebug-handler", - "version": "1.4.4", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba" + "reference": "f28d44c286812c714741478d968104c5e604a1d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6e076a124f7ee146f2487554a94b6a19a74887ba", - "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", + "reference": "f28d44c286812c714741478d968104c5e604a1d4", "shasum": "" }, "require": { @@ -5679,7 +6141,7 @@ "type": "tidelift" } ], - "time": "2020-10-24T12:39:10+00:00" + "time": "2020-11-13T08:04:11+00:00" }, { "name": "dnoegel/php-xdg-base-dir", @@ -5716,36 +6178,31 @@ }, { "name": "doctrine/instantiator", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -5759,7 +6216,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -5782,7 +6239,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T17:27:14+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { "name": "facade/flare-client-php", @@ -5847,16 +6304,16 @@ }, { "name": "facade/ignition", - "version": "2.5.0", + "version": "2.5.2", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "81698c5e32837c74abf9bb764ff0c1b3e001afb3" + "reference": "08668034beb185fa2ac6f09b1034eaa440952ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/81698c5e32837c74abf9bb764ff0c1b3e001afb3", - "reference": "81698c5e32837c74abf9bb764ff0c1b3e001afb3", + "url": "https://api.github.com/repos/facade/ignition/zipball/08668034beb185fa2ac6f09b1034eaa440952ace", + "reference": "08668034beb185fa2ac6f09b1034eaa440952ace", "shasum": "" }, "require": { @@ -5914,7 +6371,7 @@ "laravel", "page" ], - "time": "2020-10-27T13:02:22+00:00" + "time": "2020-11-17T09:18:51+00:00" }, { "name": "facade/ignition-contracts", @@ -6382,16 +6839,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.10.1", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", "shasum": "" }, "require": { @@ -6432,7 +6889,7 @@ "type": "tidelift" } ], - "time": "2020-06-29T13:22:24+00:00" + "time": "2020-11-13T09:40:50+00:00" }, { "name": "nikic/php-parser", @@ -7182,16 +7639,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.4.2", + "version": "9.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa" + "reference": "9fa359ff5ddaa5eb2be2bedb08a6a5787a5807ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa", - "reference": "3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9fa359ff5ddaa5eb2be2bedb08a6a5787a5807ab", + "reference": "9fa359ff5ddaa5eb2be2bedb08a6a5787a5807ab", "shasum": "" }, "require": { @@ -7277,7 +7734,7 @@ "type": "github" } ], - "time": "2020-10-19T09:23:29+00:00" + "time": "2020-11-10T12:53:30+00:00" }, { "name": "psy/psysh", @@ -7357,12 +7814,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "e440567339d5fe93d9525e377c5e686b0b08bcca" + "reference": "a7ebffcf8b453dcf36a9461cb7845885cb95d315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e440567339d5fe93d9525e377c5e686b0b08bcca", - "reference": "e440567339d5fe93d9525e377c5e686b0b08bcca", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/a7ebffcf8b453dcf36a9461cb7845885cb95d315", + "reference": "a7ebffcf8b453dcf36a9461cb7845885cb95d315", "shasum": "" }, "conflict": { @@ -7497,9 +7954,11 @@ "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "pimcore/pimcore": "<6.3", + "pocketmine/pocketmine-mp": "<3.15.4", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", + "prestashop/productcomments": ">=4,<4.2", "prestashop/ps_facetedsearch": "<3.4.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", @@ -7515,7 +7974,7 @@ "serluck/phpwhois": "<=4.2.6", "shopware/core": "<=6.3.2", "shopware/platform": "<=6.3.2", - "shopware/shopware": "<5.3.7", + "shopware/shopware": "<5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", @@ -7660,7 +8119,7 @@ "type": "tidelift" } ], - "time": "2020-11-07T16:07:08+00:00" + "time": "2020-11-16T22:01:59+00:00" }, { "name": "sebastian/cli-parser", @@ -8564,16 +9023,16 @@ }, { "name": "seld/jsonlint", - "version": "1.8.2", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337" + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/590cfec960b77fd55e39b7d9246659e95dd6d337", - "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { @@ -8619,7 +9078,7 @@ "type": "tidelift" } ], - "time": "2020-08-25T06:56:57+00:00" + "time": "2020-11-11T09:19:24+00:00" }, { "name": "seld/phar-utils", diff --git a/config/app.php b/config/app.php index a596f784..eba061b6 100644 --- a/config/app.php +++ b/config/app.php @@ -206,6 +206,7 @@ // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + App\Providers\FortifyServiceProvider::class, ], diff --git a/config/backup.php b/config/backup.php index 4c86dd6a..b13a2e9f 100644 --- a/config/backup.php +++ b/config/backup.php @@ -1,9 +1,5 @@ [ @@ -12,7 +8,7 @@ * The name of this application. You can use this name to monitor * the backups. */ - 'name' => 'backups', + 'name' => env('APP_NAME', 'laravel-backup'), 'source' => [ @@ -33,13 +29,17 @@ 'exclude' => [ base_path('vendor'), base_path('node_modules'), - storage_path('app/backups'), ], /* * Determines if symlinks should be followed. */ 'follow_links' => false, + + /* + * Determines if it should avoid unreadable folders. + */ + 'ignore_unreadable_directories' => false, ], /* @@ -88,7 +88,7 @@ * * If you do not want any compressor at all, set it to null. */ - 'database_dump_compressor' => Spatie\DbDumper\Compressors\GzipCompressor::class, + 'database_dump_compressor' => null, 'destination' => [ @@ -101,7 +101,7 @@ * The disk names on which the backups will be stored. */ 'disks' => [ - env('BACKUP_DISK', 'local'), + env('BACKUP_DISK', 'local_backups'), ], ], @@ -113,7 +113,7 @@ /* * You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'. - * For Slack you need to install guzzlehttp/guzzle. + * For Slack you need to install guzzlehttp/guzzle and laravel/slack-notification-channel. * * You can also use your own notification classes, just make sure the class is named after one of * the `Spatie\Backup\Events` classes. @@ -121,12 +121,12 @@ 'notifications' => [ 'notifications' => [ - \Spatie\Backup\Notifications\Notifications\BackupHasFailed::class => $backupNotificationChannel, - \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFound::class => $backupNotificationChannel, - \Spatie\Backup\Notifications\Notifications\CleanupHasFailed::class => $backupNotificationChannel, - \Spatie\Backup\Notifications\Notifications\BackupWasSuccessful::class => $backupNotificationChannel, - \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFound::class => $backupNotificationChannel, - \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessful::class => $backupNotificationChannel, + \Spatie\Backup\Notifications\Notifications\BackupHasFailed::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFound::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\CleanupHasFailed::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\BackupWasSuccessful::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFound::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessful::class => ['mail'], ], /* @@ -136,20 +136,25 @@ 'notifiable' => \Spatie\Backup\Notifications\Notifiable::class, 'mail' => [ - 'to' => env('BACKUP_NOTIFICATION_EMAIL') ?: User::find(1)->mail ?? null, + 'to' => env('BACKUP_NOTIFICATION_EMAIL'), + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], ], 'slack' => [ - 'webhook_url' => env('BACKUP_NOTIFICATION_SLACK_WEBHOOK', ''), + 'webhook_url' => '', /* * If this is set to null the default channel of the webhook will be used. */ - 'channel' => env('BACKUP_NOTIFICATION_SLACK_CHANNEL', null), + 'channel' => null, - 'username' => env('BACKUP_NOTIFICATION_SLACK_USERNAME', null), + 'username' => null, - 'icon' => env('BACKUP_NOTIFICATION_SLACK_ICON', null), + 'icon' => null, ], ], @@ -161,13 +166,24 @@ */ 'monitor_backups' => [ [ - 'name' => 'backups', + 'name' => env('APP_NAME', 'laravel-backup'), 'disks' => [env('BACKUP_DISK', 'local_backups')], 'health_checks' => [ \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1, - \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => env('BACKUP_MAX_SIZE', 512), + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000, ], ], + + /* + [ + 'name' => 'name of the second app', + 'disks' => ['local', 's3'], + 'health_checks' => [ + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1, + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000, + ], + ], + */ ], 'cleanup' => [ @@ -213,7 +229,8 @@ * After cleaning up the backups remove the oldest backup until * this amount of megabytes has been reached. */ - 'delete_oldest_backups_when_using_more_megabytes_than' => env('BACKUP_MAX_SIZE', 512), + 'delete_oldest_backups_when_using_more_megabytes_than' => 5000, ], ], + ]; diff --git a/config/fortify.php b/config/fortify.php new file mode 100644 index 00000000..5ec37723 --- /dev/null +++ b/config/fortify.php @@ -0,0 +1,144 @@ + 'web', + + /* + |-------------------------------------------------------------------------- + | Fortify Password Broker + |-------------------------------------------------------------------------- + | + | Here you may specify which password broker Fortify can use when a user + | is resetting their password. This configured value should match one + | of your password brokers setup in your "auth" configuration file. + | + */ + + 'passwords' => 'users', + + /* + |-------------------------------------------------------------------------- + | Username / Email + |-------------------------------------------------------------------------- + | + | This value defines which model attribute should be considered as your + | application's "username" field. Typically, this might be the email + | address of the users but you are free to change this value here. + | + | Out of the box, Fortify expects forgot password and reset password + | requests to have a field named 'email'. If the application uses + | another name for the field you may define it below as needed. + | + */ + + 'username' => 'email', + + 'email' => 'email', + + /* + |-------------------------------------------------------------------------- + | Home Path + |-------------------------------------------------------------------------- + | + | Here you may configure the path where users will get redirected during + | authentication or password reset when the operations are successful + | and the user is authenticated. You are free to change this value. + | + */ + + 'home' => RouteServiceProvider::HOME, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Prefix / Subdomain + |-------------------------------------------------------------------------- + | + | Here you may specify which prefix Fortify will assign to the all routes + | that it registers with the application. If necessary, you may change + | subdomain under which all of the Fortify routes will be available. + | + */ + + 'prefix' => '', + + 'domain' => null, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Middleware + |-------------------------------------------------------------------------- + | + | Here you may specify which middleware Fortify will assign to the routes + | that it registers with the application. If necessary, you may change + | these middleware but typically this provided default is preferred. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Rate Limiting + |-------------------------------------------------------------------------- + | + | By default, Fortify will throttle logins to five requests per minute for + | every email and IP address combination. However, if you would like to + | specify a custom rate limiter to call then you may specify it here. + | + */ + + 'limiters' => [ + 'login' => null, + ], + + /* + |-------------------------------------------------------------------------- + | Register View Routes + |-------------------------------------------------------------------------- + | + | Here you may specify if the routes returning views should be disabled as + | you may not need them when building your own application. This may be + | especially true if you're writing a custom single-page application. + | + */ + + 'views' => true, + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of the Fortify features are optional. You may disable the features + | by removing them from this array. You're free to only remove some of + | these features or you can even remove all of these if you need to. + | + */ + + 'features' => [ + //Features::registration(), + Features::resetPasswords(), + // Features::emailVerification(), + Features::updateProfileInformation(), + Features::updatePasswords(), + Features::twoFactorAuthentication([ + 'confirmPassword' => true, + ]), + ], + +]; diff --git a/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php new file mode 100644 index 00000000..f4500c98 --- /dev/null +++ b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php @@ -0,0 +1,38 @@ +text('two_factor_secret') + ->after('password') + ->nullable(); + + $table->text('two_factor_recovery_codes') + ->after('two_factor_secret') + ->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('two_factor_secret', 'two_factor_recovery_codes'); + }); + } +} diff --git a/database/seeders/ExampleSeeder.php b/database/seeders/ExampleSeeder.php index f1bd8720..93149b81 100644 --- a/database/seeders/ExampleSeeder.php +++ b/database/seeders/ExampleSeeder.php @@ -6,6 +6,7 @@ use App\Models\LinkList; use App\Models\Tag; use App\Models\User; +use Exception; use Illuminate\Database\Seeder; class ExampleSeeder extends Seeder @@ -14,8 +15,9 @@ class ExampleSeeder extends Seeder * Run the database seeds. * * @return void + * @throws Exception */ - public function run() + public function run(): void { // Generate users, categories and tags User::factory()->create(); diff --git a/docker-compose.production-simple.yml b/docker-compose.production-simple.yml index 3a48336c..ad11ca38 100644 --- a/docker-compose.production-simple.yml +++ b/docker-compose.production-simple.yml @@ -26,12 +26,13 @@ services: volumes: - ./.env:/app/.env - ./nginx-simple.conf:/opt/docker/etc/nginx/conf.d/linkace.conf:ro - - ./logs:/app/storage/logs + - linkace_logs:/app/storage/logs # Remove the hash of the following line if you want to use local backups #- ./backups:/app/storage/app/backups # Remove the hash of the following line if you are using HTTPS #- /path/to/your/ssl/certificates:/opt/docker/etc/nginx/ssl volumes: + linkace_logs: db: driver: local diff --git a/docker-compose.production.yml b/docker-compose.production.yml index c437bbc0..03f29774 100644 --- a/docker-compose.production.yml +++ b/docker-compose.production.yml @@ -21,9 +21,9 @@ services: depends_on: - db volumes: - - linkace_app:/app - ./.env:/app/.env - - ./logs:/app/storage/logs + - linkace_app:/app + - linkace_logs:/app/storage/logs # Remove the hash of the following line if you want to use local backups #- ./backups:/app/storage/app/backups @@ -50,5 +50,6 @@ services: volumes: linkace_app: + linkace_logs: db: driver: local diff --git a/package-lock.json b/package-lock.json index 78bf6666..e8d2e757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "0.0.43", + "version": "0.0.44", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -14,9 +14,9 @@ } }, "@babel/compat-data": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", - "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.5.tgz", + "integrity": "sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg==", "dev": true }, "@babel/core": { @@ -44,12 +44,12 @@ } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.12.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -74,14 +74,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", - "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.1", + "@babel/compat-data": "^7.12.5", "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.12.0", + "browserslist": "^4.14.5", "semver": "^5.5.0" } }, @@ -168,12 +168,12 @@ } }, "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { @@ -229,15 +229,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/helper-simple-access": { @@ -292,14 +292,14 @@ } }, "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { @@ -314,9 +314,9 @@ } }, "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -391,9 +391,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz", + "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -974,9 +974,9 @@ } }, "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -994,26 +994,26 @@ } }, "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", + "@babel/generator": "^7.12.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1060,9 +1060,9 @@ "dev": true }, "@types/node": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", - "integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", + "version": "14.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz", + "integrity": "sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==", "dev": true }, "@types/q": { @@ -1654,14 +1654,14 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.1.tgz", + "integrity": "sha512-dMF8sb2KQ8kJl21GUjkW1HWmcsL39GOV5vnzjqrCzEPNY0S0UfMLnumidiwIajDSBmKhYf5iRW+HXaM4cvCKBw==", "dev": true, "requires": { "find-cache-dir": "^2.1.0", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", + "make-dir": "^2.1.0", "pify": "^4.0.1", "schema-utils": "^2.6.5" }, @@ -1776,9 +1776,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "batch": { @@ -1976,21 +1976,13 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } } }, "browserify-sign": { @@ -2039,15 +2031,16 @@ } }, "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "version": "4.14.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz", + "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001157", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.591", + "escalade": "^3.1.1", + "node-releases": "^1.1.66" } }, "buffer": { @@ -2134,6 +2127,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2193,9 +2196,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001150", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz", - "integrity": "sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==", + "version": "1.0.30001158", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001158.tgz", + "integrity": "sha512-s5loVYY+yKpuVA3HyW8BarzrtJvwHReuzugQXlv1iR3LKSReoFXRm86mT6hT7PEF5RxW+XQZg+6nYjlywYzQ+g==", "dev": true }, "cardinal": { @@ -2377,9 +2380,9 @@ } }, "collect.js": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.28.4.tgz", - "integrity": "sha512-NJXATt6r+gtGOgDJOKLeooTY6QpGn8YQN/PkKnCmajJOguz/xGPgPrTyrBkmBBTHXnniPRIkUqjqt3AkjwCKlg==", + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.28.5.tgz", + "integrity": "sha512-uMhSsveaJUxQJPqt942me4IzP0Esig+RfThxGtJLIJ049GBRj60/J5fUK1hxR2crj64IrHMc17a1svBPFm2pzw==", "dev": true }, "collection-visit": { @@ -2612,12 +2615,12 @@ "dev": true }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.7.0.tgz", + "integrity": "sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.14.6", "semver": "7.0.0" }, "dependencies": { @@ -2954,28 +2957,28 @@ "dev": true }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.1.1.tgz", + "integrity": "sha512-Rvq+e1e0TFB8E8X+8MQjHSY6vtol45s5gxtLI/018UsAn2IBMmwNEZRM/h+HVnAJRHjasLIKKUO3uvoMM28LvA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.0.0" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.1.tgz", + "integrity": "sha512-WroX+2MvsYcRGP8QA0p+rxzOniT/zpAoQ/DTKDSJzh5T3IQKUkFHeIIfgIapm2uaP178GWY3Mime1qbk8GO/tA==", "dev": true, "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.12", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.12.tgz", + "integrity": "sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q==", "dev": true }, "source-map": { @@ -2987,9 +2990,9 @@ } }, "csv-parse": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.12.0.tgz", - "integrity": "sha512-wPQl3H79vWLPI8cgKFcQXl0NBgYYEqVnT1i6/So7OjMpsI540oD7p93r3w6fDSyPvwkTepG05F69/7AViX2lXg==" + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.14.1.tgz", + "integrity": "sha512-4wmcO7QbWtDAncGFaBwlWFPhEN4Akr64IbM4zvDwEOFekI8blLc04Nw7XjQjtSNy+3AUAgBgtUa9nWo5Cq89Xg==" }, "cyclist": { "version": "1.0.1", @@ -3326,9 +3329,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.582", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz", - "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==", + "version": "1.3.597", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.597.tgz", + "integrity": "sha512-VJI21MucKaqyFw0oe3j9BIg+nDF4MHzUZAmUwZzrxho+s8zPCD13Fds07Rgu+MTtAadO4tYTKFdAUksKYUyIJw==", "dev": true }, "elliptic": { @@ -3438,9 +3441,9 @@ } }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -3448,7 +3451,6 @@ "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -4241,9 +4243,9 @@ "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -4252,6 +4254,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4727,9 +4740,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "iferr": { @@ -4978,9 +4991,9 @@ } }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", "dev": true, "requires": { "has": "^1.0.3" @@ -5037,6 +5050,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true + }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -5312,9 +5331,9 @@ "dev": true }, "laravel-mix": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-5.0.7.tgz", - "integrity": "sha512-TL5txnQkzcwM8DYckgzjISSPGyZN6znFYb4NgtTSi9aIvfzOIEC6p0eYM6wDa/BkEKv290Ru6HWmH6Q2XApogQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-5.0.9.tgz", + "integrity": "sha512-1WCJiHimTRW3KlxcabRTco0q+bo4uKPaFTkc6cJ/bLEq4JT1aPkojoauUK7+PyiIlDJncw0Nt2MtDrv5C6j5IQ==", "dev": true, "requires": { "@babel/core": "^7.2.0", @@ -5873,18 +5892,33 @@ } }, "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", "shellwords": "^0.1.1", - "which": "^1.3.0" + "which": "^1.3.1" }, "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5897,9 +5931,9 @@ } }, "node-releases": { - "version": "1.1.64", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", - "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==", + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", "dev": true }, "normalize-path": { @@ -6003,6 +6037,28 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object-keys": { @@ -6021,13 +6077,13 @@ } }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } @@ -6040,27 +6096,6 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "object.omit": { @@ -6091,27 +6126,6 @@ "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "obuf": { @@ -7365,9 +7379,9 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { @@ -7418,27 +7432,6 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "regexpu-core": { @@ -7527,12 +7520,12 @@ "dev": true }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -7724,9 +7717,9 @@ "dev": true }, "sass": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", - "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.29.0.tgz", + "integrity": "sha512-ZpwAUFgnvAUCdkjwPREny+17BpUj8nh5Yr6zKPGtLNTLrmtoRYIjm7njP24COhjJldjwW1dcv52Lpf4tNZVVRA==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -8493,6 +8486,28 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string.prototype.trimstart": { @@ -8503,6 +8518,28 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string_decoder": { @@ -8759,9 +8796,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -9121,27 +9158,6 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "utils-merge": { @@ -9157,9 +9173,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "vary": { @@ -9187,9 +9203,9 @@ "dev": true }, "vue-loader": { - "version": "15.9.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz", - "integrity": "sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA==", + "version": "15.9.5", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.5.tgz", + "integrity": "sha512-oeMOs2b5o5gRqkxfds10bCx6JeXYTwivRgbb8hzOrcThD2z1+GqEKE3EX9A2SGbsYDf4rXwRg6D5n1w0jO5SwA==", "dev": true, "requires": { "@vue/component-compiler-utils": "^3.1.0", @@ -9226,15 +9242,15 @@ "dev": true }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" + "watchpack-chokidar2": "^2.0.1" }, "dependencies": { "anymatch": { @@ -9349,9 +9365,9 @@ } }, "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "dev": true, "optional": true, "requires": { @@ -9782,12 +9798,12 @@ } }, "webpack-notifier": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz", - "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.10.1.tgz", + "integrity": "sha512-1ntvm2QwT+i21Nur88HU/WaaDq1Ppq1XCpBR0//wb6gPJ65IkRkuYzIu8z8MpnkLEHj9wSf+yNUzMANyqvvtWg==", "dev": true, "requires": { - "node-notifier": "^5.1.2", + "node-notifier": "^6.0.0", "object-assign": "^4.1.0", "strip-ansi": "^3.0.1" } diff --git a/package.json b/package.json index 52839cb2..8ccc0c82 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "0.0.43", + "version": "0.0.44", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { @@ -14,9 +14,9 @@ }, "devDependencies": { "cross-env": "^6.0.3", - "laravel-mix": "^5.0.7", + "laravel-mix": "^5.0.9", "resolve-url-loader": "^3.1.2", - "sass": "^1.27.0", + "sass": "^1.29.0", "sass-loader": "^8.0.2", "vue-template-compiler": "^2.6.12" }, diff --git a/phpcs.xml b/phpcs.xml index 780038fd..774c11e9 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -4,16 +4,18 @@