diff options
48 files changed, 606 insertions, 373 deletions
diff --git a/phpBB/composer.json b/phpBB/composer.json index e74dd120f0..69f0de8479 100644 --- a/phpBB/composer.json +++ b/phpBB/composer.json @@ -44,6 +44,7 @@  		"sami/sami": "1.*",  		"squizlabs/php_codesniffer": "1.*",  		"symfony/browser-kit": "2.3.*", +		"symfony/css-selector": "2.3.*",  		"symfony/debug": "2.3.*",  		"symfony/dom-crawler": "2.3.*",  		"symfony/filesystem": "2.3.*", diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 671daa70e1..b686bfef5c 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -3,7 +3,7 @@          "This file locks the dependencies of your project to a known state",          "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"      ], -    "hash": "27d5da149e0b5d76b76f43210306b666", +    "hash": "d93446768ea0665b7c55c01890153a67",      "packages": [          {              "name": "lusitanian/oauth", @@ -108,17 +108,17 @@          },          {              "name": "symfony/config", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Config",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Config.git", -                "reference": "259722b5f2e87d3f487630abfd40f922cf2f6900" +                "reference": "b34d2b32a92938476f0689486e7a11ea1aeb079e"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Config/zipball/259722b5f2e87d3f487630abfd40f922cf2f6900", -                "reference": "259722b5f2e87d3f487630abfd40f922cf2f6900", +                "url": "https://api.github.com/repos/symfony/Config/zipball/b34d2b32a92938476f0689486e7a11ea1aeb079e", +                "reference": "b34d2b32a92938476f0689486e7a11ea1aeb079e",                  "shasum": ""              },              "require": { @@ -142,33 +142,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Config Component",              "homepage": "http://symfony.com", -            "time": "2014-04-22 08:09:28" +            "time": "2014-08-02 07:53:48"          },          {              "name": "symfony/console", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Console",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Console.git", -                "reference": "c6c5a354a9945a5e9a9a6a495ca19558eb8639e9" +                "reference": "a2723f99716c2fa6411e2eb5842edbe680e4b462"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Console/zipball/c6c5a354a9945a5e9a9a6a495ca19558eb8639e9", -                "reference": "c6c5a354a9945a5e9a9a6a495ca19558eb8639e9", +                "url": "https://api.github.com/repos/symfony/Console/zipball/a2723f99716c2fa6411e2eb5842edbe680e4b462", +                "reference": "a2723f99716c2fa6411e2eb5842edbe680e4b462",                  "shasum": ""              },              "require": { @@ -197,33 +195,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Console Component",              "homepage": "http://symfony.com", -            "time": "2014-05-14 13:35:53" +            "time": "2014-08-07 15:55:24"          },          {              "name": "symfony/debug", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Debug",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Debug.git", -                "reference": "ca764f8af9cc4ba5d81b598c1b18b30db5508e18" +                "reference": "91e3a1480c67601d2406cd938735abe0243e1c95"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Debug/zipball/ca764f8af9cc4ba5d81b598c1b18b30db5508e18", -                "reference": "ca764f8af9cc4ba5d81b598c1b18b30db5508e18", +                "url": "https://api.github.com/repos/symfony/Debug/zipball/91e3a1480c67601d2406cd938735abe0243e1c95", +                "reference": "91e3a1480c67601d2406cd938735abe0243e1c95",                  "shasum": ""              },              "require": { @@ -255,33 +251,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Debug Component",              "homepage": "http://symfony.com", -            "time": "2014-04-29 19:42:43" +            "time": "2014-07-07 10:13:42"          },          {              "name": "symfony/dependency-injection", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/DependencyInjection",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/DependencyInjection.git", -                "reference": "5ebd813eac59b4051705a2e29e32f211a966b6ca" +                "reference": "5ee5795515be251c56057d79154e561ee1efecd2"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/5ebd813eac59b4051705a2e29e32f211a966b6ca", -                "reference": "5ebd813eac59b4051705a2e29e32f211a966b6ca", +                "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/5ee5795515be251c56057d79154e561ee1efecd2", +                "reference": "5ee5795515be251c56057d79154e561ee1efecd2",                  "shasum": ""              },              "require": { @@ -313,33 +307,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony DependencyInjection Component",              "homepage": "http://symfony.com", -            "time": "2014-05-02 22:42:57" +            "time": "2014-08-27 08:32:18"          },          {              "name": "symfony/event-dispatcher", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/EventDispatcher",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/EventDispatcher.git", -                "reference": "cb7cd38c081507d10997553c4c522956a4d2afab" +                "reference": "2c64e46d7e22bcafcab4413ff62bc389abf87ea5"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/cb7cd38c081507d10997553c4c522956a4d2afab", -                "reference": "cb7cd38c081507d10997553c4c522956a4d2afab", +                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/2c64e46d7e22bcafcab4413ff62bc389abf87ea5", +                "reference": "2c64e46d7e22bcafcab4413ff62bc389abf87ea5",                  "shasum": ""              },              "require": { @@ -369,33 +361,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony EventDispatcher Component",              "homepage": "http://symfony.com", -            "time": "2014-04-16 10:30:19" +            "time": "2014-07-25 15:00:14"          },          {              "name": "symfony/filesystem", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Filesystem",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Filesystem.git", -                "reference": "69e476c4db31c43ab7ab797adc5fc73d20aa5571" +                "reference": "007359d2822d5eba4f04f6507bc9b46877c622b4"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Filesystem/zipball/69e476c4db31c43ab7ab797adc5fc73d20aa5571", -                "reference": "69e476c4db31c43ab7ab797adc5fc73d20aa5571", +                "url": "https://api.github.com/repos/symfony/Filesystem/zipball/007359d2822d5eba4f04f6507bc9b46877c622b4", +                "reference": "007359d2822d5eba4f04f6507bc9b46877c622b4",                  "shasum": ""              },              "require": { @@ -418,33 +408,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Filesystem Component",              "homepage": "http://symfony.com", -            "time": "2014-04-16 10:30:19" +            "time": "2014-08-31 03:30:23"          },          {              "name": "symfony/http-foundation", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/HttpFoundation",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/HttpFoundation.git", -                "reference": "ad7891d4dfe221c5a9edca64b71bdb500f5b026a" +                "reference": "d0125fed988da9e189864c2e6de967b3ee7f1d98"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/ad7891d4dfe221c5a9edca64b71bdb500f5b026a", -                "reference": "ad7891d4dfe221c5a9edca64b71bdb500f5b026a", +                "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/d0125fed988da9e189864c2e6de967b3ee7f1d98", +                "reference": "d0125fed988da9e189864c2e6de967b3ee7f1d98",                  "shasum": ""              },              "require": { @@ -470,33 +458,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony HttpFoundation Component",              "homepage": "http://symfony.com", -            "time": "2014-05-22 16:20:26" +            "time": "2014-09-03 07:39:11"          },          {              "name": "symfony/http-kernel", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/HttpKernel",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/HttpKernel.git", -                "reference": "d8c00747f592183692afaacf622c444c36092613" +                "reference": "a24817f69012b23ce7c554af6b4c7b53235c7c55"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/d8c00747f592183692afaacf622c444c36092613", -                "reference": "d8c00747f592183692afaacf622c444c36092613", +                "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/a24817f69012b23ce7c554af6b4c7b53235c7c55", +                "reference": "a24817f69012b23ce7c554af6b4c7b53235c7c55",                  "shasum": ""              },              "require": { @@ -543,33 +529,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony HttpKernel Component",              "homepage": "http://symfony.com", -            "time": "2014-05-31 02:04:21" +            "time": "2014-09-03 09:45:27"          },          {              "name": "symfony/routing", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Routing",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Routing.git", -                "reference": "6e4c9024a04340b83e456a1a24597dba066dcdc9" +                "reference": "aa2beef5d5f1d84250b5ca73a4056c0504e5969e"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Routing/zipball/6e4c9024a04340b83e456a1a24597dba066dcdc9", -                "reference": "6e4c9024a04340b83e456a1a24597dba066dcdc9", +                "url": "https://api.github.com/repos/symfony/Routing/zipball/aa2beef5d5f1d84250b5ca73a4056c0504e5969e", +                "reference": "aa2beef5d5f1d84250b5ca73a4056c0504e5969e",                  "shasum": ""              },              "require": { @@ -603,33 +587,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Routing Component",              "homepage": "http://symfony.com", -            "time": "2014-04-23 13:35:47" +            "time": "2014-08-15 09:05:55"          },          {              "name": "symfony/yaml", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Yaml",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Yaml.git", -                "reference": "2e257c292cfce88bf6c894a03d0fe8d782055aee" +                "reference": "71ceeca3d8164f0c5313127b24ad056071ccf2c6"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Yaml/zipball/2e257c292cfce88bf6c894a03d0fe8d782055aee", -                "reference": "2e257c292cfce88bf6c894a03d0fe8d782055aee", +                "url": "https://api.github.com/repos/symfony/Yaml/zipball/71ceeca3d8164f0c5313127b24ad056071ccf2c6", +                "reference": "71ceeca3d8164f0c5313127b24ad056071ccf2c6",                  "shasum": ""              },              "require": { @@ -652,19 +634,17 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Yaml Component",              "homepage": "http://symfony.com", -            "time": "2014-05-12 09:13:35" +            "time": "2014-08-28 01:42:35"          },          {              "name": "twig/twig", @@ -2007,17 +1987,17 @@          },          {              "name": "symfony/browser-kit", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/BrowserKit",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/BrowserKit.git", -                "reference": "bc6cb0fe5196ecfe183483791928ed525ac41728" +                "reference": "262d698efaa788ce24ff9c987378789bf3f81ce9"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/bc6cb0fe5196ecfe183483791928ed525ac41728", -                "reference": "bc6cb0fe5196ecfe183483791928ed525ac41728", +                "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/262d698efaa788ce24ff9c987378789bf3f81ce9", +                "reference": "262d698efaa788ce24ff9c987378789bf3f81ce9",                  "shasum": ""              },              "require": { @@ -2048,33 +2028,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony BrowserKit Component",              "homepage": "http://symfony.com", -            "time": "2014-04-22 14:58:51" +            "time": "2014-08-05 07:20:55"          },          {              "name": "symfony/css-selector", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/CssSelector",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/CssSelector.git", -                "reference": "2ff53e8a7870b453836e879b083b971d455e174d" +                "reference": "8953d325d3341c246abadb79be172de95ef80664"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/CssSelector/zipball/2ff53e8a7870b453836e879b083b971d455e174d", -                "reference": "2ff53e8a7870b453836e879b083b971d455e174d", +                "url": "https://api.github.com/repos/symfony/CssSelector/zipball/8953d325d3341c246abadb79be172de95ef80664", +                "reference": "8953d325d3341c246abadb79be172de95ef80664",                  "shasum": ""              },              "require": { @@ -2097,37 +2075,35 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors"                  },                  {                      "name": "Jean-François Simon",                      "email": "jeanfrancois.simon@sensiolabs.com" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony CssSelector Component",              "homepage": "http://symfony.com", -            "time": "2014-05-12 09:13:35" +            "time": "2014-08-27 08:24:06"          },          {              "name": "symfony/dom-crawler", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/DomCrawler",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/DomCrawler.git", -                "reference": "5dd259d7842480fa7c5d4a45c4f911bd6fb60bc8" +                "reference": "bad8d98561f071639fa67b20680bffcc256ce252"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/5dd259d7842480fa7c5d4a45c4f911bd6fb60bc8", -                "reference": "5dd259d7842480fa7c5d4a45c4f911bd6fb60bc8", +                "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/bad8d98561f071639fa67b20680bffcc256ce252", +                "reference": "bad8d98561f071639fa67b20680bffcc256ce252",                  "shasum": ""              },              "require": { @@ -2156,33 +2132,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony DomCrawler Component",              "homepage": "http://symfony.com", -            "time": "2014-05-26 22:15:18" +            "time": "2014-08-21 00:21:59"          },          {              "name": "symfony/finder", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Finder",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Finder.git", -                "reference": "32949721cc76afd75e4ac60d14ac3cf55b10a768" +                "reference": "f7a5a5a3b1fc0ec9a1a5b4429223a8726e0f4b55"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Finder/zipball/32949721cc76afd75e4ac60d14ac3cf55b10a768", -                "reference": "32949721cc76afd75e4ac60d14ac3cf55b10a768", +                "url": "https://api.github.com/repos/symfony/Finder/zipball/f7a5a5a3b1fc0ec9a1a5b4429223a8726e0f4b55", +                "reference": "f7a5a5a3b1fc0ec9a1a5b4429223a8726e0f4b55",                  "shasum": ""              },              "require": { @@ -2205,33 +2179,31 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Finder Component",              "homepage": "http://symfony.com", -            "time": "2014-05-22 13:42:36" +            "time": "2014-08-31 04:03:32"          },          {              "name": "symfony/process", -            "version": "v2.3.16", +            "version": "v2.3.19",              "target-dir": "Symfony/Component/Process",              "source": {                  "type": "git",                  "url": "https://github.com/symfony/Process.git", -                "reference": "2cd7d075df6cb0d564c069a66408b3877c07d4e3" +                "reference": "b8fc0e4b6750e4c458a38d038e6b4d538d4fe2bb"              },              "dist": {                  "type": "zip", -                "url": "https://api.github.com/repos/symfony/Process/zipball/2cd7d075df6cb0d564c069a66408b3877c07d4e3", -                "reference": "2cd7d075df6cb0d564c069a66408b3877c07d4e3", +                "url": "https://api.github.com/repos/symfony/Process/zipball/b8fc0e4b6750e4c458a38d038e6b4d538d4fe2bb", +                "reference": "b8fc0e4b6750e4c458a38d038e6b4d538d4fe2bb",                  "shasum": ""              },              "require": { @@ -2254,19 +2226,17 @@              ],              "authors": [                  { -                    "name": "Fabien Potencier", -                    "email": "fabien@symfony.com", -                    "homepage": "http://fabien.potencier.org", -                    "role": "Lead Developer" -                }, -                {                      "name": "Symfony Community",                      "homepage": "http://symfony.com/contributors" +                }, +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com"                  }              ],              "description": "Symfony Process Component",              "homepage": "http://symfony.com", -            "time": "2014-05-17 21:49:26" +            "time": "2014-08-28 09:02:24"          }      ],      "aliases": [ diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 4f39e71c3c..e1308c71d1 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -434,6 +434,38 @@ memberlist_view_user_statistics_before  * Since: 3.1.0-a1  * Purpose: Add entries before the user statistics part of any user profile +mcp_warn_post_add_warning_field_after +=== +* Locations: +    + styles/prosilver/template/mcp_warn_post.html +    + styles/subsilver2/template/mcp_warn_post.html +* Since: 3.1.0-RC4 +* Purpose: Add content during warning for a post - after add warning field. + +mcp_warn_post_add_warning_field_before +=== +* Locations: +    + styles/prosilver/template/mcp_warn_post.html +    + styles/subsilver2/template/mcp_warn_post.html +* Since: 3.1.0-RC4 +* Purpose: Add content during warning for a post - before add warning field. + +mcp_warn_user_add_warning_field_after +=== +* Locations: +    + styles/prosilver/template/mcp_warn_user.html +    + styles/subsilver2/template/mcp_warn_user.html +* Since: 3.1.0-RC4 +* Purpose: Add content during warning a user - after add warning field. + +mcp_warn_user_add_warning_field_before +=== +* Locations: +    + styles/prosilver/template/mcp_warn_user.html +    + styles/subsilver2/template/mcp_warn_user.html +* Since: 3.1.0-RC4 +* Purpose: Add content during warning a user - before add warning field. +  navbar_header_logged_out_content  ===  * Locations: @@ -732,6 +764,22 @@ posting_editor_subject_before  * Since: 3.1.0-a2  * Purpose: Add field (e.g. textbox) to the posting screen before the subject +posting_pm_header_find_username_after +=== +* Locations: +    + styles/prosilver/template/posting_pm_header.html +    + styles/subsilver2/template/ucp_header.html +* Since: 3.1.0-RC4 +* Purpose: Add content after the find username link on composing pm + +posting_pm_header_find_username_before +=== +* Locations: +    + styles/prosilver/template/posting_pm_header.html +    + styles/subsilver2/template/ucp_header.html +* Since: 3.1.0-RC4 +* Purpose: Add content before the find username link on composing pm +  quickreply_editor_panel_after  ===  * Locations: @@ -1227,6 +1275,14 @@ viewtopic_body_postrow_post_before  * Since: 3.1.0-a4  * Purpose: Add data before posts +viewtopic_body_postrow_post_content_footer +=== +* Locations: +    + styles/prosilver/template/viewtopic_body.html +    + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-RC4 +* Purpose: Add data at the end of the posts. +  viewtopic_body_postrow_post_notices_after  ===  * Locations: diff --git a/phpBB/download/file.php b/phpBB/download/file.php index fd94e78fee..db657e95f0 100644 --- a/phpBB/download/file.php +++ b/phpBB/download/file.php @@ -56,6 +56,8 @@ if (isset($_GET['avatar']))  	$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);  	$phpbb_class_loader_ext->register(); +	phpbb_load_extensions_autoloaders($phpbb_root_path); +  	// Set up container  	$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx);  	$phpbb_container = $phpbb_container_builder->get_container(); diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php index fda6ef25ec..046281596c 100644 --- a/phpBB/includes/acp/acp_profile.php +++ b/phpBB/includes/acp/acp_profile.php @@ -112,58 +112,8 @@ class acp_profile  					$db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");  					$db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id"); -					switch ($db->get_sql_layer()) -					{ -						case 'sqlite': -						case 'sqlite3': -							$sql = "SELECT sql -								FROM sqlite_master -								WHERE type = 'table' -									AND name = '" . PROFILE_FIELDS_DATA_TABLE . "' -								ORDER BY type DESC, name;"; -							$result = $db->sql_query($sql); -							$row = $db->sql_fetchrow($result); -							$db->sql_freeresult($result); - -							// Create a temp table and populate it, destroy the existing one -							$db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . PROFILE_FIELDS_DATA_TABLE . '"?#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql'])); -							$db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE); -							$db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE); - -							preg_match('#\((.*)\)#s', $row['sql'], $matches); - -							$new_table_cols = trim($matches[1]); -							$old_table_cols = preg_split('/,(?=[\\sa-z])/im', $new_table_cols); -							$column_list = array(); - -							foreach ($old_table_cols as $declaration) -							{ -								$entities = preg_split('#\s+#', trim($declaration)); - -								if ($entities[0] == 'PRIMARY') -								{ -									continue; -								} - -								if ($entities[0] !== 'pf_' . $field_ident) -								{ -									$column_list[] = $entities[0]; -								} -							} - -							$columns = implode(',', $column_list); - -							$new_table_cols = preg_replace('/' . 'pf_' . $field_ident . '[^,]+,/', '', $new_table_cols); - -							// create a new table and fill it up. destroy the temp one -							$db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');'); -							$db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;'); -							$db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp'); -						break; - -						default: -							$db->sql_query('ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " DROP COLUMN pf_$field_ident"); -					} +					$db_tools = $phpbb_container->get('dbal.tools'); +					$db_tools->sql_column_remove(PROFILE_FIELDS_DATA_TABLE, 'pf_' . $field_ident);  					$order = 0; @@ -932,9 +882,7 @@ class acp_profile  			$field_ident = 'pf_' . $field_ident;  			$db_tools = $phpbb_container->get('dbal.tools'); - -			list($sql_type, $null) = $db_tools->get_column_type($profile_field->get_database_column_type()); -			$profile_sql[] = $this->add_field_ident($field_ident, $sql_type); +			$db_tools->sql_column_add(PROFILE_FIELDS_DATA_TABLE, $field_ident, array($profile_field->get_database_column_type(), null));  		}  		$sql_ary = array( @@ -1188,91 +1136,4 @@ class acp_profile  			}  		}  	} - -	/** -	* Return sql statement for adding a new field ident (profile field) to the profile fields data table -	*/ -	function add_field_ident($field_ident, $sql_type) -	{ -		global $db; - -		switch ($db->get_sql_layer()) -		{ -			case 'mysql': -			case 'mysql4': -			case 'mysqli': -				$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD `$field_ident` " . $sql_type; - -			break; - -			case 'sqlite': -			case 'sqlite3': -				if (version_compare($db->sql_server_info(true), '3.0') == -1) -				{ -					$sql = "SELECT sql -						FROM sqlite_master -						WHERE type = 'table' -							AND name = '" . PROFILE_FIELDS_DATA_TABLE . "' -						ORDER BY type DESC, name;"; -					$result = $db->sql_query($sql); -					$row = $db->sql_fetchrow($result); -					$db->sql_freeresult($result); - -					// Create a temp table and populate it, destroy the existing one -					$db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . PROFILE_FIELDS_DATA_TABLE . '"?#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql'])); -					$db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE); -					$db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE); - -					preg_match('#\((.*)\)#s', $row['sql'], $matches); - -					$new_table_cols = trim($matches[1]); -					$old_table_cols = explode(',', $new_table_cols); -					$column_list = array(); - -					foreach ($old_table_cols as $declaration) -					{ -						$entities = preg_split('#\s+#', trim($declaration)); -						if ($entities[0] == 'PRIMARY') -						{ -							continue; -						} -						$column_list[] = $entities[0]; -					} - -					$columns = implode(',', $column_list); - -					$new_table_cols = $field_ident . ' ' . $sql_type . ',' . $new_table_cols; - -					// create a new table and fill it up. destroy the temp one -					$db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');'); -					$db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;'); -					$db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp'); -				} -				else -				{ -					$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident [$sql_type]"; -				} - -			break; - -			case 'mssql': -			case 'mssql_odbc': -			case 'mssqlnative': -				$sql = 'ALTER TABLE [' . PROFILE_FIELDS_DATA_TABLE . "] ADD [$field_ident] " . $sql_type; - -			break; - -			case 'postgres': -				$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD COLUMN \"$field_ident\" " . $sql_type; - -			break; - -			case 'oracle': -				$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident " . $sql_type; - -			break; -		} - -		return $sql; -	}  } diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index af27ec1818..df613682a7 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1636,7 +1636,7 @@ function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $s  	if (empty($sql_sort))  	{ -		$sql_sort = 'ORDER BY t.topic_last_post_time DESC'; +		$sql_sort = 'ORDER BY t.topic_last_post_time DESC, t.topic_last_post_id DESC';  	}  	if ($config['load_db_lastread'] && $user->data['is_registered']) diff --git a/phpBB/includes/functions_mcp.php b/phpBB/includes/functions_mcp.php index 7593f08f4d..811d49f1de 100644 --- a/phpBB/includes/functions_mcp.php +++ b/phpBB/includes/functions_mcp.php @@ -521,21 +521,21 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by  			$limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  			$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'tt' => $user->lang['TOPIC_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']); -			$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views'); +			$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');  			$limit_time_sql = ($min_time) ? "AND t.topic_last_post_time >= $min_time" : '';  			break;  		case 'posts':  			$limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  			$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']); -			$sort_by_sql = array('a' => 'u.username_clean', 't' => 'p.post_time', 's' => 'p.post_subject'); +			$sort_by_sql = array('a' => 'u.username_clean', 't' => array('p.post_time', 'p.post_id'), 's' => 'p.post_subject');  			$limit_time_sql = ($min_time) ? "AND p.post_time >= $min_time" : '';  			break;  		case 'reports':  			$limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  			$sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']); -			$sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.post_time', 't' => 'r.report_time', 's' => 'p.post_subject'); +			$sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => array('p.post_time', 'p.post_id'), 't' => 'r.report_time', 's' => 'p.post_subject');  			break;  		case 'pm_reports': @@ -558,7 +558,16 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by  		$sort_key = $default_key;  	} -	$sort_order_sql = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); +	$direction = ($sort_dir == 'd') ? 'DESC' : 'ASC'; + +	if (is_array($sort_by_sql[$sort_key])) +	{ +		$sort_order_sql = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction; +	} +	else +	{ +		$sort_order_sql = $sort_by_sql[$sort_key] . ' ' . $direction; +	}  	$s_limit_days = $s_sort_key = $s_sort_dir = $sort_url = '';  	gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url); diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index acfd8d779a..768011fa5b 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -1040,6 +1040,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  	global $config, $phpbb_root_path, $phpEx, $phpbb_container;  	$phpbb_content_visibility = $phpbb_container->get('content.visibility'); +	$sql_sort = ($mode == 'post_review') ? 'ASC' : 'DESC';  	// Go ahead and pull all data for this topic  	$sql = 'SELECT p.post_id @@ -1048,8 +1049,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  			AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id, 'p.') . '  			' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . '  			' . (($mode == 'post_review_edit') ? " AND p.post_id = $cur_post_id" : '') . ' -		ORDER BY p.post_time '; -	$sql .= ($mode == 'post_review') ? 'ASC' : 'DESC'; +		ORDER BY p.post_time ' . $sql_sort . ', p.post_id ' . $sql_sort;  	$result = $db->sql_query_limit($sql, $config['posts_per_page']);  	$post_list = array(); @@ -1342,7 +1342,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  				WHERE p.topic_id = $topic_id  					AND p.poster_id = u.user_id  					AND p.post_visibility = " . ITEM_APPROVED . ' -				ORDER BY p.post_time ASC'; +				ORDER BY p.post_time ASC, p.post_id ASC';  			$result = $db->sql_query_limit($sql, 1);  			$row = $db->sql_fetchrow($result);  			$db->sql_freeresult($result); @@ -1354,7 +1354,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  					FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u  					WHERE p.topic_id = $topic_id  						AND p.poster_id = u.user_id -					ORDER BY p.post_time ASC"; +					ORDER BY p.post_time ASC, p.post_id ASC";  				$result = $db->sql_query_limit($sql, 1);  				$row = $db->sql_fetchrow($result);  				$db->sql_freeresult($result); @@ -1409,7 +1409,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  				WHERE topic_id = $topic_id  					AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id) . '  					AND post_time > ' . $data['post_time'] . ' -				ORDER BY post_time ASC'; +				ORDER BY post_time ASC, post_id ASC';  			$result = $db->sql_query_limit($sql, 1);  			$next_post_id = (int) $db->sql_fetchfield('post_id');  			$db->sql_freeresult($result); diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php index a0a67ccf3d..f179b2fd70 100644 --- a/phpBB/includes/functions_upload.php +++ b/phpBB/includes/functions_upload.php @@ -232,7 +232,12 @@ class filespec  	{  		if ($this->mimetype_guesser !== null)  		{ -			$this->mimetype = $this->mimetype_guesser->guess($filename); +			$mimetype = $this->mimetype_guesser->guess($filename, $this->uploadname); + +			if ($mimetype !== 'application/octet-stream') +			{ +				$this->mimetype = $mimetype; +			}  		}  		return $this->mimetype; diff --git a/phpBB/includes/mcp/mcp_front.php b/phpBB/includes/mcp/mcp_front.php index b4ec0092e7..ebcf7ce643 100644 --- a/phpBB/includes/mcp/mcp_front.php +++ b/phpBB/includes/mcp/mcp_front.php @@ -66,7 +66,7 @@ function mcp_front_view($id, $mode, $action)  					FROM ' . POSTS_TABLE . '  					WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '  						AND ' . $db->sql_in_set('post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE)) . ' -					ORDER BY post_time DESC'; +					ORDER BY post_time DESC, post_id DESC';  				$result = $db->sql_query_limit($sql, 5);  				while ($row = $db->sql_fetchrow($result)) @@ -101,7 +101,7 @@ function mcp_front_view($id, $mode, $action)  					WHERE ' . $db->sql_in_set('p.post_id', $post_list) . '  						AND t.topic_id = p.topic_id  						AND p.poster_id = u.user_id -					ORDER BY p.post_time DESC'; +					ORDER BY p.post_time DESC, p.post_id DESC';  				$result = $db->sql_query($sql);  				while ($row = $db->sql_fetchrow($result)) @@ -190,7 +190,7 @@ function mcp_front_view($id, $mode, $action)  						AND p.poster_id = u2.user_id  						AND ' . $db->sql_in_set('p.forum_id', $forum_list), -					'ORDER_BY'	=> 'p.post_time DESC', +					'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  				);  				/** diff --git a/phpBB/includes/mcp/mcp_main.php b/phpBB/includes/mcp/mcp_main.php index 92000c6ceb..f03bc034e4 100644 --- a/phpBB/includes/mcp/mcp_main.php +++ b/phpBB/includes/mcp/mcp_main.php @@ -1265,7 +1265,7 @@ function mcp_fork_topic($topic_ids)  			$sql = 'SELECT *  				FROM ' . POSTS_TABLE . "  				WHERE topic_id = $topic_id -				ORDER BY post_time ASC"; +				ORDER BY post_time ASC, post_id ASC";  			$result = $db->sql_query($sql);  			$post_rows = array(); diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php index ba118e5db8..247b9d1651 100644 --- a/phpBB/includes/mcp/mcp_reports.php +++ b/phpBB/includes/mcp/mcp_reports.php @@ -364,6 +364,27 @@ class mcp_reports  						AND r.pm_id = 0  						$limit_time_sql  					ORDER BY $sort_order_sql"; + +				/** +				* Alter sql query to get report id of all reports for requested forum and topic or just forum +				* +				* @event core.mcp_reports_get_reports_query_before +				* @var	string	sql						String with the query to be executed +				* @var	array	forum_list				List of forums that contain the posts +				* @var	int		topic_id				topic_id in the page request +				* @var	string	limit_time_sql			String with the SQL code to limit the time interval of the post (Note: May be empty string) +				* @var	string	sort_order_sql			String with the ORDER BY SQL code used in this query +				* @since 3.1.0-RC4 +				*/ +				$vars = array( +					'sql', +					'forum_list', +					'topic_id', +					'limit_time_sql', +					'sort_order_sql', +				); +				extract($phpbb_dispatcher->trigger_event('core.mcp_reports_get_reports_query_before', compact($vars))); +  				$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);  				$i = 0; diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index 304c04eb3d..a1624e78ec 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -81,7 +81,7 @@ class ucp_main  						FROM $sql_from  						WHERE t.topic_type = " . POST_GLOBAL . '  							AND ' . $db->sql_in_set('t.forum_id', $forum_ary) . ' -						ORDER BY t.topic_last_post_time DESC'; +						ORDER BY t.topic_last_post_time DESC, t.topic_last_post_id DESC';  					$result = $db->sql_query($sql);  					while ($row = $db->sql_fetchrow($result)) @@ -693,7 +693,7 @@ class ucp_main  					AND t.topic_id = tw.topic_id  					AND ' . $db->sql_in_set('t.forum_id', $forbidden_forum_ary, true, true), -				'ORDER_BY'	=> 't.topic_last_post_time DESC' +				'ORDER_BY'	=> 't.topic_last_post_time DESC, t.topic_last_post_id DESC'  			);  			$sql_array['LEFT_JOIN'] = array(); @@ -710,7 +710,7 @@ class ucp_main  				'WHERE'		=> 'b.user_id = ' . $user->data['user_id'] . '  					AND ' . $db->sql_in_set('f.forum_id', $forbidden_forum_ary, true, true), -				'ORDER_BY'	=> 't.topic_last_post_time DESC' +				'ORDER_BY'	=> 't.topic_last_post_time DESC, t.topic_last_post_id DESC'  			);  			$sql_array['LEFT_JOIN'] = array(); diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php index a8c8920a7d..3ff8fe9ada 100644 --- a/phpBB/includes/ucp/ucp_prefs.php +++ b/phpBB/includes/ucp/ucp_prefs.php @@ -223,11 +223,11 @@ class ucp_prefs  				$data = array(  					'topic_sk'		=> request_var('topic_sk', (!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't'),  					'topic_sd'		=> request_var('topic_sd', (!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd'), -					'topic_st'		=> request_var('topic_st', (!empty($user->data['user_topic_show_days'])) ? $user->data['user_topic_show_days'] : 0), +					'topic_st'		=> request_var('topic_st', (!empty($user->data['user_topic_show_days'])) ? (int) $user->data['user_topic_show_days'] : 0),  					'post_sk'		=> request_var('post_sk', (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'),  					'post_sd'		=> request_var('post_sd', (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'), -					'post_st'		=> request_var('post_st', (!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0), +					'post_st'		=> request_var('post_st', (!empty($user->data['user_post_show_days'])) ? (int) $user->data['user_post_show_days'] : 0),  					'images'		=> request_var('images', (bool) $user->optionget('viewimg')),  					'flash'			=> request_var('flash', (bool) $user->optionget('viewflash')), @@ -254,10 +254,22 @@ class ucp_prefs  				if ($submit)  				{  					$error = validate_data($data, array( -						'topic_sk'	=> array('string', false, 1, 1), -						'topic_sd'	=> array('string', false, 1, 1), -						'post_sk'	=> array('string', false, 1, 1), -						'post_sd'	=> array('string', false, 1, 1), +						'topic_sk'	=> array( +							array('string', false, 1, 1), +							array('match', false, '#(a|r|s|t|v)#'), +						), +						'topic_sd'	=> array( +							array('string', false, 1, 1), +							array('match', false, '#(a|d)#'), +						), +						'post_sk'	=> array( +							array('string', false, 1, 1), +							array('match', false, '#(a|s|t)#'), +						), +						'post_sd'	=> array( +							array('string', false, 1, 1), +							array('match', false, '#(a|d)#'), +						),  					));  					if (!check_form_key('ucp_prefs_view')) @@ -320,7 +332,7 @@ class ucp_prefs  				$limit_topic_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  				$sort_by_topic_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']); -				$sort_by_topic_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'r' => 't.topic_posts_approved', 's' => 't.topic_title', 'v' => 't.topic_views'); +				$sort_by_topic_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'r' => 't.topic_posts_approved', 's' => 't.topic_title', 'v' => 't.topic_views');  				// Post ordering options  				$limit_post_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']); diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 783faa8fad..c27086fd38 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -864,6 +864,10 @@ $lang = array_merge($lang, array(  	'WRONG_DATA_COLOUR'			=> 'The colour value you entered is invalid.',  	'WRONG_DATA_JABBER'			=> 'The name you entered is not a valid Jabber account name.',  	'WRONG_DATA_LANG'			=> 'The language you specified is not valid.', +	'WRONG_DATA_POST_SD'		=> 'The post sort direction you specified is not valid.', +	'WRONG_DATA_POST_SK'		=> 'The post sort option you specified is not valid.', +	'WRONG_DATA_TOPIC_SD'		=> 'The topic sort direction you specified is not valid.', +	'WRONG_DATA_TOPIC_SK'		=> 'The topic sort option you specified is not valid.',  	'WROTE'						=> 'wrote',  	'YAHOO'				=> 'Yahoo Messenger', diff --git a/phpBB/phpbb/feed/forum.php b/phpBB/phpbb/feed/forum.php index 610b755af3..7a2087c1cd 100644 --- a/phpBB/phpbb/feed/forum.php +++ b/phpBB/phpbb/feed/forum.php @@ -94,7 +94,7 @@ class forum extends \phpbb\feed\post_base  			WHERE forum_id = ' . $this->forum_id . '  				AND topic_moved_id = 0  				AND ' . $this->content_visibility->get_visibility_sql('topic', $this->forum_id) . ' -			ORDER BY topic_last_post_time DESC'; +			ORDER BY topic_last_post_time DESC, topic_last_post_id DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items);  		$topic_ids = array(); @@ -123,7 +123,7 @@ class forum extends \phpbb\feed\post_base  							AND ' . $this->content_visibility->get_visibility_sql('post', $this->forum_id, 'p.') . '  							AND p.post_time >= ' . $min_post_time . '  							AND p.poster_id = u.user_id', -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/feed/news.php b/phpBB/phpbb/feed/news.php index ea5f4febf5..a02c199d85 100644 --- a/phpBB/phpbb/feed/news.php +++ b/phpBB/phpbb/feed/news.php @@ -99,7 +99,7 @@ class news extends \phpbb\feed\topic_base  			),  			'WHERE'		=> 'p.topic_id = t.topic_id  							AND ' . $this->db->sql_in_set('p.post_id', $post_ids), -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/feed/overall.php b/phpBB/phpbb/feed/overall.php index f6847c041e..ab452f5386 100644 --- a/phpBB/phpbb/feed/overall.php +++ b/phpBB/phpbb/feed/overall.php @@ -34,7 +34,7 @@ class overall extends \phpbb\feed\post_base  			FROM ' . TOPICS_TABLE . '  			WHERE topic_moved_id = 0  				AND ' . $this->content_visibility->get_forums_visibility_sql('topic', $forum_ids) . ' -			ORDER BY topic_last_post_time DESC'; +			ORDER BY topic_last_post_time DESC, topic_last_post_id DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items);  		$topic_ids = array(); @@ -71,7 +71,7 @@ class overall extends \phpbb\feed\post_base  							AND ' . $this->content_visibility->get_forums_visibility_sql('post', $forum_ids, 'p.') . '  							AND p.post_time >= ' . $min_post_time . '  							AND u.user_id = p.poster_id', -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/feed/topic.php b/phpBB/phpbb/feed/topic.php index 78e0b4b8ab..66c49e55cf 100644 --- a/phpBB/phpbb/feed/topic.php +++ b/phpBB/phpbb/feed/topic.php @@ -101,7 +101,7 @@ class topic extends \phpbb\feed\post_base  			'WHERE'		=> 'p.topic_id = ' . $this->topic_id . '  								AND ' . $this->content_visibility->get_visibility_sql('post', $this->forum_id, 'p.') . '  								AND p.poster_id = u.user_id', -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/feed/topics.php b/phpBB/phpbb/feed/topics.php index 88ca7c33f3..2b9cb3501a 100644 --- a/phpBB/phpbb/feed/topics.php +++ b/phpBB/phpbb/feed/topics.php @@ -71,7 +71,7 @@ class topics extends \phpbb\feed\topic_base  			),  			'WHERE'		=> 'p.topic_id = t.topic_id  							AND ' . $this->db->sql_in_set('p.post_id', $post_ids), -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/feed/topics_active.php b/phpBB/phpbb/feed/topics_active.php index cde6d36f45..6d5eddfc16 100644 --- a/phpBB/phpbb/feed/topics_active.php +++ b/phpBB/phpbb/feed/topics_active.php @@ -56,7 +56,7 @@ class topics_active extends \phpbb\feed\topic_base  			WHERE topic_moved_id = 0  				AND ' . $this->content_visibility->get_forums_visibility_sql('topic', $in_fid_ary) . '  				' . $last_post_time_sql . ' -			ORDER BY topic_last_post_time DESC'; +			ORDER BY topic_last_post_time DESC, topic_last_post_id DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items);  		$post_ids = array(); @@ -88,7 +88,7 @@ class topics_active extends \phpbb\feed\topic_base  			),  			'WHERE'		=> 'p.topic_id = t.topic_id  							AND ' . $this->db->sql_in_set('p.post_id', $post_ids), -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php index 773a1f822a..8baa77089b 100644 --- a/phpBB/phpbb/mimetype/guesser.php +++ b/phpBB/phpbb/mimetype/guesser.php @@ -115,17 +115,42 @@ class guesser  			return false;  		} +		$mimetype = 'application/octet-stream'; +  		foreach ($this->guessers as $guesser)  		{ -			$mimetype = $guesser->guess($file, $file_name); +			$mimetype_guess = $guesser->guess($file, $file_name); -			// Try to guess something that is not the fallback application/octet-stream -			if ($mimetype !== null && $mimetype !== 'application/octet-stream') -			{ -				return $mimetype; -			} +			$mimetype = $this->choose_mime_type($mimetype, $mimetype_guess);  		}  		// Return any mimetype if we got a result or the fallback value -		return (!empty($mimetype)) ? $mimetype : 'application/octet-stream'; +		return $mimetype; +	} + +	/** +	 * Choose the best mime type based on the current mime type and the guess +	 * If a guesser returns nulls or application/octet-stream, we will keep +	 * the current guess. Guesses with a slash inside them will be favored over +	 * already existing ones. However, any guess that will pass the first check +	 * will always overwrite the default application/octet-stream. +	 * +	 * @param	string	$mime_type	The current mime type +	 * @param	string	$guess		The current mime type guess +	 * +	 * @return string The best mime type based on current mime type and guess +	 */ +	public function choose_mime_type($mime_type, $guess) +	{ +		if ($guess === null || $guess == 'application/octet-stream') +		{ +			return $mime_type; +		} + +		if ($mime_type == 'application/octet-stream' || strpos($guess, '/') !== false) +		{ +			$mime_type = $guess; +		} + +		return $mime_type;  	}  } diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index 38dbbab51e..936564d8b6 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -316,7 +316,7 @@ class path_helper  	* Glue URL parameters together  	*  	* @param array $params URL parameters in the form of array(name => value) -	* @return string Returns the glued string, e.g. name1=value1&name2=value2 +	* @return string Returns the glued string, e.g. name1=value1&name2&name3=value3  	*/  	public function glue_url_params($params)  	{ @@ -324,7 +324,15 @@ class path_helper  		foreach ($params as $key => $value)  		{ -			$_params[] = $key . '=' . $value; +			// some parameters do not have value +			if ($value !== null) +			{ +				$_params[] = $key . '=' . $value; +			} +			else +			{ +				$_params[] = $key; +			}  		}  		return implode('&', $_params);  	} @@ -353,7 +361,17 @@ class path_helper  				{  					continue;  				} -				list($key, $value) = explode('=', $argument, 2); + +				// some parameters don't have value +				if (strpos($argument, '=') !== false) +				{ +					list($key, $value) = explode('=', $argument, 2); +				} +				else +				{ +					$key = $argument; +					$value = null; +				}  				if ($key === '')  				{ diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index 7d564742af..30b364821d 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -441,8 +441,8 @@ class session  					if (!$session_expired)  					{ -						// Only update session DB a minute or so after last update or if page changes -						if ($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page'])) +						// Only update session DB a minute or so after last update or if page changes and is not ajax request +						if (($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page'])) && !$request->is_ajax())  						{  							$sql_ary = array('session_time' => $this->time_now); diff --git a/phpBB/phpbb/template/twig/twig.php b/phpBB/phpbb/template/twig/twig.php index 5e2057f818..a3b002f350 100644 --- a/phpBB/phpbb/template/twig/twig.php +++ b/phpBB/phpbb/template/twig/twig.php @@ -177,6 +177,10 @@ class twig extends \phpbb\template\base  		}  		$names = $this->get_user_style(); +		// Add 'all' folder to $names array +		//	It allows extensions to load a template file from 'all' folder, +		//	if a style doesn't include it. +		$names[] = 'all';  		$paths = array();  		foreach ($style_directories as $directory) diff --git a/phpBB/styles/prosilver/template/mcp_warn_post.html b/phpBB/styles/prosilver/template/mcp_warn_post.html index 0dd2e14d92..59c7d0d495 100644 --- a/phpBB/styles/prosilver/template/mcp_warn_post.html +++ b/phpBB/styles/prosilver/template/mcp_warn_post.html @@ -44,6 +44,8 @@  	</div>  </div> +<!-- EVENT mcp_warn_post_add_warning_field_before --> +  <div class="panel">  	<div class="inner"> @@ -64,6 +66,8 @@  	</div>  </div> +<!-- EVENT mcp_warn_post_add_warning_field_after --> +  <fieldset class="submit-buttons">  	<input type="reset" value="{L_RESET}" name="reset" class="button2" />    	<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1" /> diff --git a/phpBB/styles/prosilver/template/mcp_warn_user.html b/phpBB/styles/prosilver/template/mcp_warn_user.html index 1541f2e5f6..1ad6df7ade 100644 --- a/phpBB/styles/prosilver/template/mcp_warn_user.html +++ b/phpBB/styles/prosilver/template/mcp_warn_user.html @@ -28,6 +28,8 @@  	</div>  </div> +<!-- EVENT mcp_warn_user_add_warning_field_before --> +  <div class="panel">  	<div class="inner"> @@ -48,6 +50,8 @@  	</div>  </div> +<!-- EVENT mcp_warn_user_add_warning_field_after --> +  <fieldset class="submit-buttons">  	<input type="reset" value="{L_RESET}" name="reset" class="button2" />    	<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1" /> diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index 076a3160f0..1ea5b0973c 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -3,8 +3,6 @@  <head>  <meta charset="utf-8">  <meta name="viewport" content="width=device-width" /> -<meta name="keywords" content="" /> -<meta name="description" content="" />  {META}  <title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title> diff --git a/phpBB/styles/prosilver/template/posting_pm_header.html b/phpBB/styles/prosilver/template/posting_pm_header.html index dea50b5daf..032d8c6a6f 100644 --- a/phpBB/styles/prosilver/template/posting_pm_header.html +++ b/phpBB/styles/prosilver/template/posting_pm_header.html @@ -15,7 +15,9 @@  				<dd class="recipients">  				<input type="submit" name="add_to" value="{L_ADD}" class="button2" tabindex="1" />  				<input type="submit" name="add_bcc" value="{L_ADD_BCC}" class="button2" tabindex="1" /> +				<!-- EVENT posting_pm_header_find_username_before -->  				<span><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></span> +				<!-- EVENT posting_pm_header_find_username_after -->  				</dd>  			</dl>  			<!-- ENDIF --> diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html index 610e5d5582..6d22a074be 100644 --- a/phpBB/styles/prosilver/template/simple_header.html +++ b/phpBB/styles/prosilver/template/simple_header.html @@ -3,8 +3,6 @@  <head>  <meta charset="utf-8">  <meta name="viewport" content="width=device-width" /> -<meta name="keywords" content="" /> -<meta name="description" content="" />  {META}  <title>{SITENAME} • <!-- IF S_IN_MCP -->{L_MCP} • <!-- ELSEIF S_IN_UCP -->{L_UCP} • <!-- ENDIF -->{PAGE_TITLE}</title> diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index a51d65ae99..7ed8569798 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -302,6 +302,8 @@  			<!-- IF postrow.BUMPED_MESSAGE --><div class="notice"><br /><br />{postrow.BUMPED_MESSAGE}</div><!-- ENDIF -->  			<!-- EVENT viewtopic_body_postrow_post_notices_after -->  			<!-- IF postrow.SIGNATURE --><div id="sig{postrow.POST_ID}" class="signature">{postrow.SIGNATURE}</div><!-- ENDIF --> + +			<!-- EVENT viewtopic_body_postrow_post_content_footer -->  			</div>  		</div> diff --git a/phpBB/styles/subsilver2/template/mcp_warn_post.html b/phpBB/styles/subsilver2/template/mcp_warn_post.html index 223457d158..68715eff2d 100644 --- a/phpBB/styles/subsilver2/template/mcp_warn_post.html +++ b/phpBB/styles/subsilver2/template/mcp_warn_post.html @@ -35,6 +35,8 @@  <form method="post" name="mcp" action="{U_POST_ACTION}"> +<!-- EVENT mcp_warn_post_add_warning_field_before --> +  <table width="100%" cellpadding="3" cellspacing="1" border="0" class="tablebg">  <tr>  	<th align="center">{L_ADD_WARNING}</th> @@ -54,6 +56,9 @@  	<td class="cat" align="center"><input class="btnmain" type="submit" name="action[add_warning]" value="{L_SUBMIT}" />  <input class="btnlite" type="reset" value="{L_RESET}" /></td>  </tr>  </table> + +<!-- EVENT mcp_warn_post_add_warning_field_after --> +  {S_FORM_TOKEN}  </form> diff --git a/phpBB/styles/subsilver2/template/mcp_warn_user.html b/phpBB/styles/subsilver2/template/mcp_warn_user.html index 6b78c71557..20b57c6837 100644 --- a/phpBB/styles/subsilver2/template/mcp_warn_user.html +++ b/phpBB/styles/subsilver2/template/mcp_warn_user.html @@ -48,6 +48,8 @@  <form method="post" name="mcp" action="{U_POST_ACTION}"> +<!-- EVENT mcp_warn_user_add_warning_field_before --> +  <table width="100%" cellpadding="3" cellspacing="1" border="0" class="tablebg">  <tr>  	<th align="center">{L_ADD_WARNING}</th> @@ -67,6 +69,9 @@  	<td class="cat" align="center"><input class="btnmain" type="submit" name="action[add_warning]" value="{L_SUBMIT}" />  <input class="btnlite" type="reset" value="{L_RESET}" /></td>  </tr>  </table> + +<!-- EVENT mcp_warn_user_add_warning_field_after --> +  {S_FORM_TOKEN}  </form> diff --git a/phpBB/styles/subsilver2/template/overall_header.html b/phpBB/styles/subsilver2/template/overall_header.html index ebb7b3be4d..4741154889 100644 --- a/phpBB/styles/subsilver2/template/overall_header.html +++ b/phpBB/styles/subsilver2/template/overall_header.html @@ -2,8 +2,6 @@  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head>  <meta charset="utf-8"> -<meta name="keywords" content="" /> -<meta name="description" content="" />  {META}  <title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title> diff --git a/phpBB/styles/subsilver2/template/simple_header.html b/phpBB/styles/subsilver2/template/simple_header.html index 0c3dff4a05..d292c4594a 100644 --- a/phpBB/styles/subsilver2/template/simple_header.html +++ b/phpBB/styles/subsilver2/template/simple_header.html @@ -2,8 +2,6 @@  <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">  <head>  <meta charset="utf-8"> -<meta name="keywords" content="" /> -<meta name="description" content="" />  {META}  <title>{SITENAME} • <!-- IF S_IN_MCP -->{L_MCP} • <!-- ELSEIF S_IN_UCP -->{L_UCP} • <!-- ENDIF -->{PAGE_TITLE}</title> diff --git a/phpBB/styles/subsilver2/template/ucp_header.html b/phpBB/styles/subsilver2/template/ucp_header.html index e3aaef6943..dff2841b54 100644 --- a/phpBB/styles/subsilver2/template/ucp_header.html +++ b/phpBB/styles/subsilver2/template/ucp_header.html @@ -25,11 +25,13 @@  		<tr>  			<td class="row1"><b class="genmed">{L_USERNAMES}{L_COLON}</b></td>  		</tr> +		<!-- EVENT posting_pm_header_find_username_before -->  		<tr>  			<td class="row2"><textarea name="username_list" rows="5" cols="22" tabindex="1"></textarea><br />  				[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]  			</td>  		</tr> +		<!-- EVENT posting_pm_header_find_username_after -->  	<!-- ENDIF -->  	<!-- IF S_GROUP_OPTIONS -->  		<tr> diff --git a/phpBB/styles/subsilver2/template/viewtopic_body.html b/phpBB/styles/subsilver2/template/viewtopic_body.html index 0f34b50950..838f6c5f03 100644 --- a/phpBB/styles/subsilver2/template/viewtopic_body.html +++ b/phpBB/styles/subsilver2/template/viewtopic_body.html @@ -308,6 +308,8 @@  					<!-- ENDIF -->  					<!-- EVENT viewtopic_body_postrow_post_notices_after --> +					<!-- EVENT viewtopic_body_postrow_post_content_footer --> +  					<!-- IF not postrow.S_HAS_ATTACHMENTS --><br clear="all" /><br /><!-- ENDIF -->  						<table width="100%" cellspacing="0"> diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php index b34bf19de2..cc5755349b 100644 --- a/phpBB/viewforum.php +++ b/phpBB/viewforum.php @@ -264,7 +264,7 @@ gen_forum_auth_level('forum', $forum_id, $forum_data['forum_status']);  $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']); -$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views'); +$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');  $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';  gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir); @@ -502,7 +502,7 @@ if ($start > $topics_count / 2)  	$store_reverse = true;  	// Select the sort order -	$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'ASC' : 'DESC'); +	$direction = (($sort_dir == 'd') ? 'ASC' : 'DESC');  	$sql_limit = $pagination->reverse_limit($start, $sql_limit, $topics_count);  	$sql_start = $pagination->reverse_start($start, $sql_limit, $topics_count); @@ -510,10 +510,19 @@ if ($start > $topics_count / 2)  else  {  	// Select the sort order -	$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); +	$direction = (($sort_dir == 'd') ? 'DESC' : 'ASC');  	$sql_start = $start;  } +if (is_array($sort_by_sql[$sort_key])) +{ +	$sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction; +} +else +{ +	$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction; +} +  if ($forum_data['forum_type'] == FORUM_POST || !sizeof($active_forum_ary))  {  	$sql_where = 't.forum_id = ' . $forum_id; diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index c2faffca85..3c837bd136 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -94,7 +94,7 @@ if ($view && !$post_id)  				AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id) . "  				AND post_time > $topic_last_read  				AND forum_id = $forum_id -			ORDER BY post_time ASC"; +			ORDER BY post_time ASC, post_id ASC";  		$result = $db->sql_query_limit($sql, 1);  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); @@ -146,7 +146,7 @@ if ($view && !$post_id)  					AND topic_moved_id = 0  					AND topic_last_post_time $sql_condition {$row['topic_last_post_time']}  					AND " . $phpbb_content_visibility->get_visibility_sql('topic', $row['forum_id']) . " -				ORDER BY topic_last_post_time $sql_ordering"; +				ORDER BY topic_last_post_time $sql_ordering, topic_last_post_id $sql_ordering";  			$result = $db->sql_query_limit($sql, 1);  			$row = $db->sql_fetchrow($result);  			$db->sql_freeresult($result); @@ -388,7 +388,7 @@ if (!isset($topic_tracking_info))  $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);  $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']); -$sort_by_sql = array('a' => array('u.username_clean', 'p.post_id'), 't' => 'p.post_time', 's' => array('p.post_subject', 'p.post_id')); +$sort_by_sql = array('a' => array('u.username_clean', 'p.post_id'), 't' => array('p.post_time', 'p.post_id'), 's' => array('p.post_subject', 'p.post_id'));  $join_user_sql = array('a' => true, 't' => false, 's' => false);  $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; @@ -2117,9 +2117,11 @@ $page_title = $topic_data['topic_title'] . ($start ? ' - ' . sprintf($user->lang  * @var	array	topic_data		Array with topic data  * @var	int		forum_id		Forum ID of the topic  * @var	int		start			Start offset used to calculate the page +* @var	array	post_list		Array with post_ids we are going to display  * @since 3.1.0-a1 +* @change 3.1.0-RC4 Added post_list var  */ -$vars = array('page_title', 'topic_data', 'forum_id', 'start'); +$vars = array('page_title', 'topic_data', 'forum_id', 'start', 'post_list');  extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_page_title', compact($vars)));  // Output the page diff --git a/tests/extension/ext/vendor4/bar/composer.json b/tests/extension/ext/vendor4/bar/composer.json new file mode 100644 index 0000000000..1a2fddc3f4 --- /dev/null +++ b/tests/extension/ext/vendor4/bar/composer.json @@ -0,0 +1,23 @@ +{ +	"name": "vendor4/bar", +	"type": "phpbb-extension", +	"description": "An example/sample extension to be used for testing purposes in phpBB Development.", +	"version": "1.0.0", +	"time": "2012-02-15 01:01:01", +	"license": "GPL-2.0", +	"authors": [{ +			"name": "John Smith", +			"email": "email@phpbb.com", +			"homepage": "http://phpbb.com", +			"role": "N/A" +		}], +	"require": { +		"php": ">=5.3" +	}, +	"extra": { +		"display-name": "phpBB Bar Extension", +		"soft-require": { +			"phpbb/phpbb": "3.1.*@dev" +		} +	} +} diff --git a/tests/extension/ext/vendor4/bar/styles/all/template/foobar_body.html b/tests/extension/ext/vendor4/bar/styles/all/template/foobar_body.html new file mode 100644 index 0000000000..c8f8cf957e --- /dev/null +++ b/tests/extension/ext/vendor4/bar/styles/all/template/foobar_body.html @@ -0,0 +1 @@ +All folder diff --git a/tests/extension/manager_test.php b/tests/extension/manager_test.php index 5ec8e60a68..5c7cad89f6 100644 --- a/tests/extension/manager_test.php +++ b/tests/extension/manager_test.php @@ -36,7 +36,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case  	public function test_all_available()  	{  		// barfoo and vendor3/bar should not listed due to missing composer.json. barfoo also has incorrect dir structure. -		$this->assertEquals(array('vendor/moo', 'vendor2/bar', 'vendor2/foo', 'vendor3/foo'), array_keys($this->extension_manager->all_available())); +		$this->assertEquals(array('vendor/moo', 'vendor2/bar', 'vendor2/foo', 'vendor3/foo', 'vendor4/bar'), array_keys($this->extension_manager->all_available()));  	}  	public function test_all_enabled() diff --git a/tests/functional/extension_acp_test.php b/tests/functional/extension_acp_test.php index 6490c1ead3..7be8957ec7 100644 --- a/tests/functional/extension_acp_test.php +++ b/tests/functional/extension_acp_test.php @@ -84,7 +84,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case  		$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid);  		$this->assertCount(1, $crawler->filter('.ext_enabled')); -		$this->assertCount(5, $crawler->filter('.ext_disabled')); +		$this->assertCount(6, $crawler->filter('.ext_disabled'));  		$this->assertContains('phpBB Foo Extension', $crawler->filter('.ext_enabled')->eq(0)->text());  		$this->assertContainsLang('EXTENSION_DISABLE', $crawler->filter('.ext_enabled')->eq(0)->text()); diff --git a/tests/functional/fileupload_form_test.php b/tests/functional/fileupload_form_test.php index e87953367f..b8c48389e0 100644 --- a/tests/functional/fileupload_form_test.php +++ b/tests/functional/fileupload_form_test.php @@ -107,9 +107,9 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case  		$crawler = $this->upload_file('disallowed.jpg', 'image/jpeg'); -		// Hitting the ATTACHED_IMAGE_NOT_IMAGE error means we passed the +		// Hitting the UNABLE_GET_IMAGE_SIZE error means we passed the  		// DISALLOWED_CONTENT check -		$this->assertContains($this->lang('ATTACHED_IMAGE_NOT_IMAGE'), $crawler->text()); +		$this->assertContainsLang('UNABLE_GET_IMAGE_SIZE', $crawler->text());  	}  	public function test_too_large() diff --git a/tests/functional/ucp_preferences_test.php b/tests/functional/ucp_preferences_test.php new file mode 100644 index 0000000000..7ef325dc4b --- /dev/null +++ b/tests/functional/ucp_preferences_test.php @@ -0,0 +1,85 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +/** +* @group functional +*/ +class phpbb_functional_ucp_preferences_test extends phpbb_functional_test_case +{ +	public function test_submitting_preferences_view() +	{ +		$this->add_lang('ucp'); +		$this->login(); + +		$crawler = self::request('GET', 'ucp.php?i=ucp_prefs&mode=view'); +		$this->assertContainsLang('UCP_PREFS_VIEW', $crawler->filter('#cp-main h2')->text()); + +		$form = $crawler->selectButton('Submit')->form(array( +			'topic_sk'	=> 'a', +			'topic_sd'	=> 'a', +			'topic_st'	=> '1', +			'post_sk'	=> 'a', +			'post_sd'	=> 'a', +			'post_st'	=> '1', +		)); + +		$crawler = self::submit($form); +		$this->assertContainsLang('PREFERENCES_UPDATED', $crawler->filter('#message')->text()); +	} + +	public function test_submitting_invalid_preferences_view() +	{ +		$this->add_lang('ucp'); +		$this->login(); + +		$crawler = self::request('GET', 'ucp.php?i=ucp_prefs&mode=view'); +		$this->assertContainsLang('UCP_PREFS_VIEW', $crawler->filter('#cp-main h2')->text()); +		$form = $crawler->selectButton('Submit')->form(); + +		if (!method_exists($form, 'disableValidation')) +		{ +			$this->markTestIncomplete('The crawler cannot select invalid values, until Symfony 2.4!'); +		} + +		$form = $form->disableValidation(); +		$form['topic_sk']->select('z'); +		$form['topic_sd']->select('z'); +		$form['topic_st']->select('test'); +		$form['post_sk']->select('z'); +		$form['post_sd']->select('z'); +		$form['post_st']->select('test'); + +		$crawler = self::submit($form); +		$this->assertContainsLang('WRONG_DATA_POST_SD', $crawler->filter('#cp-main')->text()); +		$this->assertContainsLang('WRONG_DATA_POST_SK', $crawler->filter('#cp-main')->text()); +		$this->assertContainsLang('WRONG_DATA_TOPIC_SD', $crawler->filter('#cp-main')->text()); +		$this->assertContainsLang('WRONG_DATA_TOPIC_SK', $crawler->filter('#cp-main')->text()); +	} + +	public function test_read_preferences_view() +	{ +		$this->add_lang('ucp'); +		$this->login(); + +		$crawler = self::request('GET', 'ucp.php?i=ucp_prefs&mode=view'); +		$this->assertContainsLang('UCP_PREFS_VIEW', $crawler->filter('#cp-main h2')->text()); +		$form = $crawler->selectButton('Submit')->form(); + +		$this->assertEquals('a', $form->get('topic_sk')->getValue()); +		$this->assertEquals('a', $form->get('topic_sd')->getValue()); +		$this->assertEquals('1', $form->get('topic_st')->getValue()); +		$this->assertEquals('a', $form->get('post_sk')->getValue()); +		$this->assertEquals('a', $form->get('post_sd')->getValue()); +		$this->assertEquals('1', $form->get('post_st')->getValue()); +	} +} diff --git a/tests/mimetype/guesser_test.php b/tests/mimetype/guesser_test.php index b74a9f236e..fa53e6c8c4 100644 --- a/tests/mimetype/guesser_test.php +++ b/tests/mimetype/guesser_test.php @@ -206,4 +206,25 @@ class guesser_test extends \phpbb_test_case  		$this->assertInstanceOf('\phpbb\mimetype\content_guesser', $guessers[0]);  		$this->assertInstanceOf('\phpbb\mimetype\extension_guesser', $guessers[3]);  	} + +	public function data_choose_mime_type() +	{ +		return array( +			array('application/octet-stream', 'application/octet-stream', null), +			array('application/octet-stream', 'application/octet-stream', 'application/octet-stream'), +			array('binary', 'application/octet-stream', 'binary'), +			array('image/jpeg', 'application/octet-stream', 'image/jpeg'), +			array('image/jpeg', 'binary', 'image/jpeg'), +			array('image/jpeg', 'image/jpg', 'image/jpeg'), +			array('image/jpeg', 'image/jpeg', 'binary'), +		); +	} + +	/** +	 * @dataProvider data_choose_mime_type +	 */ +	public function test_choose_mime_type($expected, $mime_type, $guess) +	{ +		$this->assertSame($expected, $this->guesser->choose_mime_type($mime_type, $guess)); +	}  } diff --git a/tests/path_helper/path_helper_test.php b/tests/path_helper/path_helper_test.php index 27e94d6a07..3832307897 100644 --- a/tests/path_helper/path_helper_test.php +++ b/tests/path_helper/path_helper_test.php @@ -205,6 +205,18 @@ class phpbb_path_helper_test extends phpbb_test_case  				array('test' => 'xyz', 'var' => 'value'),  				'test=xyz&var=value',  			), +			array( +				array('test' => null), +				'test', +			), +			array( +				array('test' => null, 'var' => null), +				'test&var', +			), +			array( +				array('test' => 'xyz', 'var' => null, 'bar' => 'value'), +				'test=xyz&var&bar=value', +			),  		);  	} @@ -254,6 +266,21 @@ class phpbb_path_helper_test extends phpbb_test_case  				true,  				array('base' => 'mcp.php', 'params' => array('f' => '3')),  			), +			array( +				'index.php?ready', +				false, +				array('base' => 'index.php', 'params' => array('ready' => null)), +			), +			array( +				'index.php?i=1&ready', +				true, +				array('base' => 'index.php', 'params' => array('i' => '1', 'ready' => null)), +			), +			array( +				'index.php?ready&i=1', +				false, +				array('base' => 'index.php', 'params' => array('ready' => null, 'i' => '1')), +			),  		);  	} diff --git a/tests/template/template_allfolder_test.php b/tests/template/template_allfolder_test.php new file mode 100644 index 0000000000..b4ad84e9c3 --- /dev/null +++ b/tests/template/template_allfolder_test.php @@ -0,0 +1,59 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +require_once dirname(__FILE__) . '/template_test_case.php'; + +class phpbb_template_allfolder_test extends phpbb_template_template_test_case +{ +	public function test_allfolder() +	{ +		$this->setup_engine_for_allfolder(); + +		$this->run_template('foobar_body.html', array(), array(), array(), "All folder"); +	} + +	protected function setup_engine_for_allfolder(array $new_config = array()) +	{ +		global $phpbb_root_path, $phpEx; + +		$defaults = $this->config_defaults(); +		$config = new \phpbb\config\config(array_merge($defaults, $new_config)); +		$this->user = new \phpbb\user('\phpbb\datetime'); + +		$path_helper = new \phpbb\path_helper( +			new \phpbb\symfony_request( +				new phpbb_mock_request() +			), +			new \phpbb\filesystem(), +			$this->getMock('\phpbb\request\request'), +			$phpbb_root_path, +			$phpEx +		); + +		$this->extension_manager = new phpbb_mock_extension_manager( +			dirname(__FILE__) . '/', +			array( +				'vendor4/bar' => array( +					'ext_name' => 'vendor4/bar', +					'ext_active' => '1', +					'ext_path' => 'ext/vendor4/bar/', +				), +			) +		); + +		$this->template_path = $this->test_path . '/templates'; +		$this->ext_template_path = 'tests/extension/ext/vendor4/bar/styles/all/template'; +		$this->template = new \phpbb\template\twig\twig($path_helper, $config, $this->user, new \phpbb\template\context(), $this->extension_manager); +		$this->template->set_custom_style('all', array($this->template_path, $this->ext_template_path)); +	} +}  | 
