diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0258cb6ba..8b3d29c2d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,7 +23,7 @@ If applicable, add screenshots to help explain your problem. **Your Configuration (please complete the following information):** - Exact BookStack Version (Found in settings): - PHP Version: - - Using Docker or reverse proxy (Yes/No): + - Hosting Method (Nginx/Apache/Docker): **Additional context** Add any other context about the problem here. diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index e011c642f..791c265ad 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -70,6 +70,7 @@ class LoginController extends Controller * @param Authenticatable $user * @return \Illuminate\Http\RedirectResponse * @throws AuthException + * @throws \BookStack\Exceptions\LdapException */ protected function authenticated(Request $request, Authenticatable $user) { diff --git a/app/Http/Middleware/Localization.php b/app/Http/Middleware/Localization.php index 466c1442b..bdbf6ccbd 100644 --- a/app/Http/Middleware/Localization.php +++ b/app/Http/Middleware/Localization.php @@ -2,6 +2,7 @@ use Carbon\Carbon; use Closure; +use Illuminate\Http\Request; class Localization { @@ -15,21 +16,33 @@ class Localization public function handle($request, Closure $next) { $defaultLang = config('app.locale'); - if (user()->isDefault()) { - $locale = $defaultLang; - $availableLocales = config('app.locales'); - foreach ($request->getLanguages() as $lang) { - if (!in_array($lang, $availableLocales)) { - continue; - } - $locale = $lang; - break; - } + + if (user()->isDefault() && config('app.auto_detect_locale')) { + $locale = $this->autoDetectLocale($request, $defaultLang); } else { $locale = setting()->getUser(user(), 'language', $defaultLang); } + app()->setLocale($locale); Carbon::setLocale($locale); return $next($request); } + + /** + * Autodetect the visitors locale by matching locales in their headers + * against the locales supported by BookStack. + * @param Request $request + * @param string $default + * @return string + */ + protected function autoDetectLocale(Request $request, string $default) + { + $availableLocales = config('app.locales'); + foreach ($request->getLanguages() as $lang) { + if (in_array($lang, $availableLocales)) { + return $lang; + } + } + return $default; + } } diff --git a/app/Services/LdapService.php b/app/Services/LdapService.php index 4936b2da8..c11094aa9 100644 --- a/app/Services/LdapService.php +++ b/app/Services/LdapService.php @@ -202,7 +202,7 @@ class LdapService /** * Get the groups a user is a part of on ldap * @param string $userName - * @return array|null + * @return array * @throws LdapException */ public function getUserGroups($userName) @@ -211,7 +211,7 @@ class LdapService $user = $this->getUserWithAttributes($userName, [$groupsAttr]); if ($user === null) { - return null; + return []; } $userGroups = $this->groupFilter($user); diff --git a/composer.json b/composer.json index 757b0982c..c9eb3821c 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "type": "project", "require": { "php": ">=7.0.0", - "laravel/framework": "~5.5.22", + "laravel/framework": "~5.5.42", "fideloper/proxy": "~3.3", "ext-tidy": "*", "intervention/image": "^2.4", diff --git a/composer.lock b/composer.lock index a06cbbef9..51fde846a 100644 --- a/composer.lock +++ b/composer.lock @@ -1,23 +1,23 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "b9ea2a42e2f7780b3a54d4b7327750e0", + "content-hash": "b98be6702f1293174f785f99895e798b", "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.56.4", + "version": "3.64.10", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "03273bb5c1d8098ff6c23b3fa9ee444c4cc1dcee" + "reference": "4aa66872c4428d0db08c861a34559b0923eaae23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/03273bb5c1d8098ff6c23b3fa9ee444c4cc1dcee", - "reference": "03273bb5c1d8098ff6c23b3fa9ee444c4cc1dcee", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4aa66872c4428d0db08c861a34559b0923eaae23", + "reference": "4aa66872c4428d0db08c861a34559b0923eaae23", "shasum": "" }, "require": { @@ -84,7 +84,7 @@ "s3", "sdk" ], - "time": "2018-05-18T19:53:15+00:00" + "time": "2018-08-10T21:49:00+00:00" }, { "name": "barryvdh/laravel-dompdf", @@ -829,16 +829,16 @@ }, { "name": "intervention/image", - "version": "2.4.1", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "3603dbcc9a17d307533473246a6c58c31cf17919" + "reference": "e82d274f786e3d4b866a59b173f42e716f0783eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/3603dbcc9a17d307533473246a6c58c31cf17919", - "reference": "3603dbcc9a17d307533473246a6c58c31cf17919", + "url": "https://api.github.com/repos/Intervention/image/zipball/e82d274f786e3d4b866a59b173f42e716f0783eb", + "reference": "e82d274f786e3d4b866a59b173f42e716f0783eb", "shasum": "" }, "require": { @@ -858,7 +858,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" }, "laravel": { "providers": [ @@ -895,7 +895,7 @@ "thumbnail", "watermark" ], - "time": "2017-09-21T16:29:17+00:00" + "time": "2018-05-29T14:19:03+00:00" }, { "name": "knplabs/knp-snappy", @@ -965,16 +965,16 @@ }, { "name": "laravel/framework", - "version": "v5.5.40", + "version": "v5.5.42", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "d724ce0aa61bbd9adf658215eec484f5dd6711d6" + "reference": "6550ae917b0c49a5915a52cd7c7eafd16fc0b538" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/d724ce0aa61bbd9adf658215eec484f5dd6711d6", - "reference": "d724ce0aa61bbd9adf658215eec484f5dd6711d6", + "url": "https://api.github.com/repos/laravel/framework/zipball/6550ae917b0c49a5915a52cd7c7eafd16fc0b538", + "reference": "6550ae917b0c49a5915a52cd7c7eafd16fc0b538", "shasum": "" }, "require": { @@ -1095,20 +1095,20 @@ "framework", "laravel" ], - "time": "2018-03-30T13:29:30+00:00" + "time": "2018-08-08T18:22:44+00:00" }, { "name": "laravel/socialite", - "version": "v3.0.11", + "version": "v3.0.12", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "4d29ba66fdb38ec994b778e5e51657555cc10511" + "reference": "b5f465847b1d637efa86bbfe2fc1c9d2bd12f60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/4d29ba66fdb38ec994b778e5e51657555cc10511", - "reference": "4d29ba66fdb38ec994b778e5e51657555cc10511", + "url": "https://api.github.com/repos/laravel/socialite/zipball/b5f465847b1d637efa86bbfe2fc1c9d2bd12f60f", + "reference": "b5f465847b1d637efa86bbfe2fc1c9d2bd12f60f", "shasum": "" }, "require": { @@ -1157,7 +1157,7 @@ "laravel", "oauth" ], - "time": "2018-05-12T17:44:53+00:00" + "time": "2018-06-01T15:06:47+00:00" }, { "name": "league/flysystem", @@ -1532,16 +1532,16 @@ }, { "name": "nesbot/carbon", - "version": "1.27.0", + "version": "1.33.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "ef81c39b67200dcd7401c24363dcac05ac3a4fe9" + "reference": "55667c1007a99e82030874b1bb14d24d07108413" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ef81c39b67200dcd7401c24363dcac05ac3a4fe9", - "reference": "ef81c39b67200dcd7401c24363dcac05ac3a4fe9", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/55667c1007a99e82030874b1bb14d24d07108413", + "reference": "55667c1007a99e82030874b1bb14d24d07108413", "shasum": "" }, "require": { @@ -1553,6 +1553,13 @@ "phpunit/phpunit": "^4.8.35 || ^5.7" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + } + }, "autoload": { "psr-4": { "": "src/" @@ -1576,37 +1583,33 @@ "datetime", "time" ], - "time": "2018-04-23T09:02:57+00:00" + "time": "2018-08-07T08:39:47+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.12", + "version": "v9.99.99", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", - "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "" }, "require": { - "php": ">=5.2.0" + "php": "^7" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -1621,10 +1624,11 @@ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", + "polyfill", "pseudorandom", "random" ], - "time": "2018-04-04T21:24:14+00:00" + "time": "2018-07-02T15:55:56+00:00" }, { "name": "phenx/php-font-lib", @@ -1665,16 +1669,16 @@ }, { "name": "phenx/php-svg-lib", - "version": "v0.3.0", + "version": "v0.3.2", "source": { "type": "git", "url": "https://github.com/PhenX/php-svg-lib.git", - "reference": "8f543ede60386faec9b0012833536de4b6083bb9" + "reference": "ccc46ef6340d4b8a4a68047e68d8501ea961442c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/8f543ede60386faec9b0012833536de4b6083bb9", - "reference": "8f543ede60386faec9b0012833536de4b6083bb9", + "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/ccc46ef6340d4b8a4a68047e68d8501ea961442c", + "reference": "ccc46ef6340d4b8a4a68047e68d8501ea961442c", "shasum": "" }, "require": { @@ -1701,7 +1705,7 @@ ], "description": "A library to read, parse and export to PDF SVG files.", "homepage": "https://github.com/PhenX/php-svg-lib", - "time": "2018-04-14T14:36:18+00:00" + "time": "2018-06-03T10:10:03+00:00" }, { "name": "predis/predis", @@ -1949,21 +1953,22 @@ }, { "name": "ramsey/uuid", - "version": "3.7.3", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76" + "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/44abcdad877d9a46685a3a4d221e3b2c4b87cb76", - "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3", + "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3", "shasum": "" }, "require": { - "paragonie/random_compat": "^1.0|^2.0", - "php": "^5.4 || ^7.0" + "paragonie/random_compat": "^1.0|^2.0|9.99.99", + "php": "^5.4 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "replace": { "rhumsaa/uuid": "self.version" @@ -1971,16 +1976,17 @@ "require-dev": { "codeception/aspect-mock": "^1.0 | ~2.0.0", "doctrine/annotations": "~1.2.0", - "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", + "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0", "ircmaxell/random-lib": "^1.1", "jakub-onderka/php-parallel-lint": "^0.9.0", "mockery/mockery": "^0.9.9", "moontoast/math": "^1.1", "php-mock/php-mock-phpunit": "^0.3|^1.1", - "phpunit/phpunit": "^4.7|^5.0", + "phpunit/phpunit": "^4.7|^5.0|^6.5", "squizlabs/php_codesniffer": "^2.3" }, "suggest": { + "ext-ctype": "Provides support for PHP Ctype functions", "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -2025,7 +2031,7 @@ "identifier", "uuid" ], - "time": "2018-01-20T00:28:24+00:00" + "time": "2018-07-19T23:38:55+00:00" }, { "name": "sabberworm/php-css-parser", @@ -2073,16 +2079,16 @@ }, { "name": "socialiteproviders/discord", - "version": "v2.0.1", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Discord.git", - "reference": "f934ca3f4fa5ea915c1d20852b826e860aa64727" + "reference": "e0cd8895f321943b36f533e7bf21ad29bcdece9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/f934ca3f4fa5ea915c1d20852b826e860aa64727", - "reference": "f934ca3f4fa5ea915c1d20852b826e860aa64727", + "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/e0cd8895f321943b36f533e7bf21ad29bcdece9a", + "reference": "e0cd8895f321943b36f533e7bf21ad29bcdece9a", "shasum": "" }, "require": { @@ -2106,20 +2112,20 @@ } ], "description": "Discord OAuth2 Provider for Laravel Socialite", - "time": "2017-08-28T02:20:40+00:00" + "time": "2018-05-26T03:40:07+00:00" }, { "name": "socialiteproviders/gitlab", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/GitLab.git", - "reference": "bab80e8e16853e062c58013b1c1f474bd5a5c49a" + "reference": "7839d22fad3179cd77f1b35af62f81d15d78e93b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/GitLab/zipball/bab80e8e16853e062c58013b1c1f474bd5a5c49a", - "reference": "bab80e8e16853e062c58013b1c1f474bd5a5c49a", + "url": "https://api.github.com/repos/SocialiteProviders/GitLab/zipball/7839d22fad3179cd77f1b35af62f81d15d78e93b", + "reference": "7839d22fad3179cd77f1b35af62f81d15d78e93b", "shasum": "" }, "require": { @@ -2143,7 +2149,7 @@ } ], "description": "GitLab OAuth2 Provider for Laravel Socialite", - "time": "2018-05-11T03:10:27+00:00" + "time": "2018-06-20T11:00:01+00:00" }, { "name": "socialiteproviders/manager", @@ -2344,16 +2350,16 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v6.0.2", + "version": "v6.1.2", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc" + "reference": "7d760881d266d63c5e7a1155cbcf2ac656a31ca8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/412333372fb6c8ffb65496a2bbd7321af75733fc", - "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7d760881d266d63c5e7a1155cbcf2ac656a31ca8", + "reference": "7d760881d266d63c5e7a1155cbcf2ac656a31ca8", "shasum": "" }, "require": { @@ -2364,10 +2370,14 @@ "mockery/mockery": "~0.9.1", "symfony/phpunit-bridge": "~3.3@dev" }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "6.1-dev" } }, "autoload": { @@ -2389,13 +2399,13 @@ } ], "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.symfony.com", + "homepage": "https://swiftmailer.symfony.com", "keywords": [ "email", "mail", "mailer" ], - "time": "2017-09-30T22:39:41+00:00" + "time": "2018-07-13T07:04:35+00:00" }, { "name": "symfony/console", @@ -2827,17 +2837,75 @@ "time": "2017-08-01T10:25:59+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.8.0", + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "3296adf6a6454a050679cde90f95350ad604b171" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", - "reference": "3296adf6a6454a050679cde90f95350ad604b171", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", "shasum": "" }, "require": { @@ -2849,7 +2917,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -2883,7 +2951,7 @@ "portable", "shim" ], - "time": "2018-04-26T10:06:28+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/process", @@ -3194,28 +3262,28 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.4.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c" + "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", - "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", + "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" + "phpunit/phpunit": "^4.8.35 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -3225,7 +3293,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause-Attribution" + "BSD-3-Clause" ], "authors": [ { @@ -3240,22 +3308,22 @@ "env", "environment" ], - "time": "2016-09-01T10:05:43+00:00" + "time": "2018-07-29T20:33:41+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.1.4", + "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "7a91480cc6e597caed5117a3c5d685f06d35c5a1" + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/7a91480cc6e597caed5117a3c5d685f06d35c5a1", - "reference": "7a91480cc6e597caed5117a3c5d685f06d35c5a1", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", "shasum": "" }, "require": { @@ -3310,7 +3378,7 @@ "profiler", "webprofiler" ], - "time": "2018-03-06T08:35:31+00:00" + "time": "2018-05-03T18:27:04+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -3490,16 +3558,16 @@ }, { "name": "filp/whoops", - "version": "2.1.14", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6" + "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/c6081b8838686aa04f1e83ba7e91f78b7b2a23e6", - "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6", + "url": "https://api.github.com/repos/filp/whoops/zipball/181c4502d8f34db7aed7bfe88d4f87875b8e947a", + "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a", "shasum": "" }, "require": { @@ -3507,9 +3575,9 @@ "psr/log": "^1.0.1" }, "require-dev": { - "mockery/mockery": "0.9.*", + "mockery/mockery": "^0.9 || ^1.0", "phpunit/phpunit": "^4.8.35 || ^5.7", - "symfony/var-dumper": "^2.6 || ^3.0" + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -3518,7 +3586,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -3547,20 +3615,20 @@ "throwable", "whoops" ], - "time": "2017-11-23T18:22:44+00:00" + "time": "2018-03-03T17:56:25+00:00" }, { "name": "fzaninotto/faker", - "version": "v1.7.1", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d" + "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", - "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de", + "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de", "shasum": "" }, "require": { @@ -3568,7 +3636,7 @@ }, "require-dev": { "ext-intl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7", "squizlabs/php_codesniffer": "^1.5" }, "type": "library", @@ -3597,7 +3665,7 @@ "faker", "fixtures" ], - "time": "2017-08-15T16:48:10+00:00" + "time": "2018-07-12T10:23:15+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -4123,16 +4191,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.6", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", "shasum": "" }, "require": { @@ -4144,12 +4212,12 @@ }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -4182,7 +4250,7 @@ "spy", "stub" ], - "time": "2018-04-18T13:57:24+00:00" + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4435,16 +4503,16 @@ }, { "name": "phpunit/phpunit", - "version": "6.5.8", + "version": "6.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b" + "reference": "7bab54cb366076023bbf457a2a0d513332cd40f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4f21a3c6b97c42952fd5c2837bb354ec0199b97b", - "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7bab54cb366076023bbf457a2a0d513332cd40f2", + "reference": "7bab54cb366076023bbf457a2a0d513332cd40f2", "shasum": "" }, "require": { @@ -4462,7 +4530,7 @@ "phpunit/php-file-iterator": "^1.4.3", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.5", + "phpunit/phpunit-mock-objects": "^5.0.9", "sebastian/comparator": "^2.1", "sebastian/diff": "^2.0", "sebastian/environment": "^3.1", @@ -4515,20 +4583,20 @@ "testing", "xunit" ], - "time": "2018-04-10T11:38:34+00:00" + "time": "2018-08-07T07:05:35+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "5.0.6", + "version": "5.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf" + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/33fd41a76e746b8fa96d00b49a23dadfa8334cdf", - "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", "shasum": "" }, "require": { @@ -4541,7 +4609,7 @@ "phpunit/phpunit": "<6.0" }, "require-dev": { - "phpunit/phpunit": "^6.5" + "phpunit/phpunit": "^6.5.11" }, "suggest": { "ext-soap": "*" @@ -4574,7 +4642,7 @@ "mock", "xunit" ], - "time": "2018-01-06T05:45:45+00:00" + "time": "2018-08-09T05:50:03+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -5137,16 +5205,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.2.3", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "4842476c434e375f9d3182ff7b89059583aa8b27" + "reference": "628a481780561150481a9ec74709092b9759b3ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4842476c434e375f9d3182ff7b89059583aa8b27", - "reference": "4842476c434e375f9d3182ff7b89059583aa8b27", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/628a481780561150481a9ec74709092b9759b3ec", + "reference": "628a481780561150481a9ec74709092b9759b3ec", "shasum": "" }, "require": { @@ -5184,7 +5252,7 @@ "phpcs", "standards" ], - "time": "2018-02-20T21:35:23+00:00" + "time": "2018-07-26T23:47:18+00:00" }, { "name": "symfony/class-loader", diff --git a/config/app.php b/config/app.php index 69e2380e8..b0883b9be 100755 --- a/config/app.php +++ b/config/app.php @@ -77,8 +77,21 @@ return [ */ 'locale' => env('APP_LANG', 'en'), + 'locales' => ['en', 'de', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'sv', 'ja', 'pl', 'it', 'ru', 'zh_CN', 'zh_TW'], + /* + |-------------------------------------------------------------------------- + | Auto-detect the locale for public users + |-------------------------------------------------------------------------- + | + | For public users their locale can be guessed by headers sent by their + | browser. This is usually set by users in their browser settings. + | If not found the default app locale will be used. + | + */ + 'auto_detect_locale' => env('APP_AUTO_LANG_PUBLIC', true), + /* |-------------------------------------------------------------------------- | Application Fallback Locale @@ -245,7 +258,7 @@ return [ 'Activity' => BookStack\Services\Facades\Activity::class, 'Setting' => BookStack\Services\Facades\Setting::class, 'Views' => BookStack\Services\Facades\Views::class, - 'Images' => \BookStack\Services\Facades\Images::class, + 'Images' => BookStack\Services\Facades\Images::class, ], diff --git a/phpunit.xml b/phpunit.xml index dbea76aa6..9434b710f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -23,6 +23,7 @@ + diff --git a/resources/lang/es/settings.php b/resources/lang/es/settings.php index d75d84213..f7e793638 100644 --- a/resources/lang/es/settings.php +++ b/resources/lang/es/settings.php @@ -82,6 +82,7 @@ return [ 'role_details' => 'Detalles de rol', 'role_name' => 'Nombre de rol', 'role_desc' => 'Descripción corta de rol', + 'role_external_auth_id' => 'ID externo de autenticación', 'role_system' => 'Permisos de sistema', 'role_manage_users' => 'Gestionar usuarios', 'role_manage_roles' => 'Gestionar roles y permisos de roles', diff --git a/resources/lang/es_AR/settings.php b/resources/lang/es_AR/settings.php index 92aaf7d86..10b2063a9 100644 --- a/resources/lang/es_AR/settings.php +++ b/resources/lang/es_AR/settings.php @@ -82,6 +82,7 @@ return [ 'role_details' => 'Detalles de rol', 'role_name' => 'Nombre de rol', 'role_desc' => 'Descripción corta de rol', + 'role_external_auth_id' => 'IDs de Autenticación Externa', 'role_system' => 'Permisos de sistema', 'role_manage_users' => 'Gestionar usuarios', 'role_manage_roles' => 'Gestionar roles y permisos de roles', diff --git a/resources/lang/sv/common.php b/resources/lang/sv/common.php index e7c1e0648..f7bf21e4a 100644 --- a/resources/lang/sv/common.php +++ b/resources/lang/sv/common.php @@ -31,6 +31,7 @@ return [ 'edit' => 'Redigera', 'sort' => 'Sortera', 'move' => 'Flytta', + 'copy' => 'Kopiera', 'reply' => 'Svara', 'delete' => 'Ta bort', 'search' => 'Sök', diff --git a/resources/lang/sv/entities.php b/resources/lang/sv/entities.php index e9d588a9f..3a2d1a2c6 100644 --- a/resources/lang/sv/entities.php +++ b/resources/lang/sv/entities.php @@ -166,6 +166,9 @@ return [ 'pages_not_in_chapter' => 'Sidan ligger inte i något kapitel', 'pages_move' => 'Flytta sida', 'pages_move_success' => 'Sidan har flyttats till ":parentName"', + 'pages_copy' => 'Kopiera sida', + 'pages_copy_desination' => 'Destination', + 'pages_copy_success' => 'Sidan har kopierats', 'pages_permissions' => 'Rättigheter för sida', 'pages_permissions_success' => 'Rättigheterna för sidan har uppdaterats', 'pages_revision' => 'Revision', diff --git a/resources/lang/sv/settings.php b/resources/lang/sv/settings.php index b0496c924..8fe92521a 100644 --- a/resources/lang/sv/settings.php +++ b/resources/lang/sv/settings.php @@ -34,6 +34,7 @@ return [ 'app_homepage' => 'Startsida', 'app_homepage_desc' => 'Välj en sida att använda som startsida istället för standardvyn. Den valda sidans rättigheter kommer att ignoreras.', 'app_homepage_default' => 'Vald vy för startsida', + 'app_homepage_books' => 'Eller välj att ha listan med böcker som startsida. Om du har valt någon annan sida som startsida ovan kommer den inställningen att ignoreras.', 'app_disable_comments' => 'Inaktivera kommentarer', 'app_disable_comments_desc' => 'Inaktivera kommentarer på alla sidor i applikationen. Befintliga kommentarer visas inte.', @@ -50,6 +51,19 @@ return [ 'reg_confirm_restrict_domain_desc' => 'Ange en kommaseparerad lista över e-postdomäner till vilka du vill begränsa registrering. Användare kommer att skickas ett mail för att bekräfta deras e-post innan de får logga in.
Notera att användare kommer att kunna ändra sin e-postadress efter lyckad registrering.', 'reg_confirm_restrict_domain_placeholder' => 'Ingen begränsning satt', + /** + * Maintenance settings + */ + + 'maint' => 'Underhåll', + 'maint_image_cleanup' => 'Rensa bilder', + 'maint_image_cleanup_desc' => "Söker igenom innehåll i sidor & revisioner för att se vilka bilder och teckningar som är i bruk och vilka som är överflödiga. Se till att ta en komplett backup av databas och bilder innan du kör detta.", + 'maint_image_cleanup_ignore_revisions' => 'Ignorera bilder i revisioner', + 'maint_image_cleanup_run' => 'Kör rensning', + 'maint_image_cleanup_warning' => 'Hittade :count bilder som potentiellt inte används. Vill du verkligen ta bort dessa bilder?', + 'maint_image_cleanup_success' => 'Hittade och raderade :count bilder som potentiellt inte används!', + 'maint_image_cleanup_nothing_found' => 'Hittade inga oanvända bilder, så inget har raderats!', + /** * Role settings */ @@ -68,6 +82,7 @@ return [ 'role_details' => 'Om rollen', 'role_name' => 'Rollens namn', 'role_desc' => 'Kort beskrivning av rollen', + 'role_external_auth_id' => 'Externa autentiserings-ID:n', 'role_system' => 'Systemrättigheter', 'role_manage_users' => 'Hanter användare', 'role_manage_roles' => 'Hantera roller & rättigheter', @@ -96,7 +111,6 @@ return [ 'users_external_auth_id' => 'Externt ID för autentisering', 'users_password_warning' => 'Fyll i nedanstående fält endast om du vill byta lösenord:', 'users_system_public' => 'Den här användaren representerar eventuella gäster som använder systemet. Den kan inte användas för att logga in utan tilldeles automatiskt.', - 'users_books_view_type' => 'Layout för visning av böcker', 'users_delete' => 'Ta bort användare', 'users_delete_named' => 'Ta bort användaren :userName', 'users_delete_warning' => 'Detta kommer att ta bort användaren \':userName\' från systemet helt och hållet.', @@ -113,26 +127,5 @@ return [ 'users_social_connect' => 'Anslut konto', 'users_social_disconnect' => 'Koppla från konto', 'users_social_connected' => ':socialAccount har kopplats till ditt konto.', - 'users_social_disconnected' => ':socialAccount har kopplats bort från ditt konto.', - - // Since these labels are already localized this array does not need to be - // translated in the language-specific files. - // DELETE BELOW IF COPIED FROM EN - /////////////////////////////////// - 'language_select' => [ - 'en' => 'English', - 'de' => 'Deutsch', - 'es' => 'Español', - 'es_AR' => 'Español Argentina', - 'fr' => 'Français', - 'nl' => 'Nederlands', - 'pt_BR' => 'Português do Brasil', - 'sk' => 'Slovensky', - 'sv' => 'Svenska', - 'ja' => '日本語', - 'pl' => 'Polski', - 'it' => 'Italian', - 'ru' => 'Русский' - ] - /////////////////////////////////// + 'users_social_disconnected' => ':socialAccount har kopplats bort från ditt konto.' ]; diff --git a/resources/lang/zh_CN/settings.php b/resources/lang/zh_CN/settings.php index 9b731777f..2195bf54d 100755 --- a/resources/lang/zh_CN/settings.php +++ b/resources/lang/zh_CN/settings.php @@ -50,6 +50,19 @@ return [ 'reg_confirm_restrict_domain_desc' => '输入您想要限制注册的Email域名列表,用逗号隔开。在被允许与应用程序交互之前,用户将被发送一封Email来确认他们的地址。
注意用户在注册成功后可以修改他们的Email地址。', 'reg_confirm_restrict_domain_placeholder' => '尚未设置限制', + /** + * Maintenance settings + */ + + 'maint' => '维护', + 'maint_image_cleanup' => '清理图像', + 'maint_image_cleanup_desc' => "扫描页面和修订内容以检查哪些图像是正在使用的以及哪些图像是多余的。确保在运行前创建完整的数据库和映像备份。", + 'maint_image_cleanup_ignore_revisions' => '忽略修订记录中的图像', + 'maint_image_cleanup_run' => '运行清理', + 'maint_image_cleanup_warning' => '发现了 :count 张可能未使用的图像。您确定要删除这些图像吗?', + 'maint_image_cleanup_success' => '找到并删除了 :count 张可能未使用的图像!', + 'maint_image_cleanup_nothing_found' => '找不到未使用的图像,没有删除!', + /** * Role settings */ diff --git a/resources/lang/zh_TW/settings.php b/resources/lang/zh_TW/settings.php index a61b15d23..7172a13c1 100644 --- a/resources/lang/zh_TW/settings.php +++ b/resources/lang/zh_TW/settings.php @@ -50,6 +50,19 @@ return [ 'reg_confirm_restrict_domain_desc' => '輸入您想要限制註冊的Email域域名稱列表,用逗號隔開。在被允許與本系統連結之前,使用者會收到一封Email來確認他們的位址。
注意,使用者在註冊成功後可以修改他們的Email位址。', 'reg_confirm_restrict_domain_placeholder' => '尚未設定限制的網域', + /** + * Maintenance settings + */ + + 'maint' => '維護', + 'maint_image_cleanup' => '清理圖像', + 'maint_image_cleanup_desc' => "掃描頁面和修訂內容以檢查哪些圖像是正在使用的以及哪些圖像是多余的。確保在運行前創建完整的數據庫和映像備份。", + 'maint_image_cleanup_ignore_revisions' => '忽略修訂記錄中的圖像', + 'maint_image_cleanup_run' => '運行清理', + 'maint_image_cleanup_warning' => '發現了 :count 張可能未使用的圖像。您確定要刪除這些圖像嗎?', + 'maint_image_cleanup_success' => '找到並刪除了 :count 張可能未使用的圖像!', + 'maint_image_cleanup_nothing_found' => '找不到未使用的圖像,沒有刪除!', + /** * Role settings */ diff --git a/tests/LanguageTest.php b/tests/LanguageTest.php index c9d6ed6f0..bf0ebbeae 100644 --- a/tests/LanguageTest.php +++ b/tests/LanguageTest.php @@ -31,6 +31,16 @@ class LanguageTest extends TestCase $loginPageFrenchReq->assertSee('Se Connecter'); } + public function test_public_lang_autodetect_can_be_disabled() + { + config()->set('app.auto_detect_locale', false); + $loginReq = $this->get('/login'); + $loginReq->assertSee('Log In'); + + $loginPageFrenchReq = $this->get('/login', ['Accept-Language' => 'fr']); + $loginPageFrenchReq->assertDontSee('Se Connecter'); + } + public function test_js_endpoint_for_each_language() {