Merge remote-tracking branch 'upstream/develop' into channel-relay

This commit is contained in:
Michael 2024-01-15 06:14:55 +00:00
commit 7a13d8b8ac
63 changed files with 621 additions and 512 deletions

View File

@ -29,12 +29,12 @@
"ext-xml": "*",
"asika/simple-console": "^1.0",
"bacon/bacon-qr-code": "^2.0.0",
"divineomega/password_exposed": "^2.8",
"divineomega/password_exposed": "^3",
"enyo/dropzone": "^5.9",
"ezyang/htmlpurifier": "^4.7",
"friendica/json-ld": "^1.0",
"geekwright/po": "^2.0",
"guzzlehttp/guzzle": "^6.5",
"guzzlehttp/guzzle": "^7",
"guzzlehttp/oauth-subscriber": "^0.6",
"kornrunner/blurhash": "^1.2",
"league/html-to-markdown": "^4.8",

625
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "082b16e2c88895f1a03d5b0ffe678ba7",
"content-hash": "356019e5d0c92aae938f5292dd0fd103",
"packages": [
{
"name": "asika/simple-console",
@ -507,38 +507,101 @@
},
{
"name": "divineomega/password_exposed",
"version": "v2.8.0",
"version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/DivineOmega/password_exposed.git",
"reference": "908ed8e62ef95411bd0f866e29c69cef2bbca880"
"reference": "327f93ee5cab54622077bcae721412b55be16720"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DivineOmega/password_exposed/zipball/908ed8e62ef95411bd0f866e29c69cef2bbca880",
"reference": "908ed8e62ef95411bd0f866e29c69cef2bbca880",
"url": "https://api.github.com/repos/DivineOmega/password_exposed/zipball/327f93ee5cab54622077bcae721412b55be16720",
"reference": "327f93ee5cab54622077bcae721412b55be16720",
"shasum": ""
},
"require": {
"divineomega/do-file-cache-psr-6": "^2.0",
"guzzlehttp/guzzle": "^6.3",
"paragonie/certainty": "^1|^2",
"php": ">=5.6"
"divineomega/psr-18-guzzle-adapter": "^1.0",
"nyholm/psr7": "^1.0",
"paragonie/certainty": "^2.4",
"php": "^7.1||^8.0",
"php-http/discovery": "^1.6",
"psr/cache": "^1.0",
"psr/http-client": "^1.0",
"psr/http-factory-implementation": "^1.0",
"psr/http-message": "^1.0",
"psr/http-message-implementation": "^1.0"
},
"require-dev": {
"fzaninotto/faker": "^1.7",
"kriswallsmith/buzz": "^1.0",
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^6.5",
"vimeo/psalm": "^1"
"phpunit/phpunit": "^7.0||^8.0",
"symfony/cache": "^4.2.12",
"vimeo/psalm": "^4"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"files": [
"src/PasswordExposedFunction.php"
],
"psr-4": {
"DivineOmega\\PasswordExposed\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0-only"
],
"authors": [
{
"name": "Jordan Hall",
"email": "jordan@hall05.co.uk"
},
{
"name": "Contributors",
"homepage": "https://github.com/DivineOmega/password_exposed/graphs/contributors"
}
],
"description": "This PHP package provides a `password_exposed` helper function, that uses the haveibeenpwned.com API to check if a password has been exposed in a data breach.",
"homepage": "https://github.com/DivineOmega/password_exposed",
"funding": [
{
"url": "https://github.com/DivineOmega",
"type": "github"
}
],
"time": "2021-04-20T09:34:23+00:00"
},
{
"name": "divineomega/psr-18-guzzle-adapter",
"version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/DivineOmega/psr-18-guzzle-adapter.git",
"reference": "a2bdcddd4d4a17aac460e58d1e064e6bd2de5e57"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DivineOmega/psr-18-guzzle-adapter/zipball/a2bdcddd4d4a17aac460e58d1e064e6bd2de5e57",
"reference": "a2bdcddd4d4a17aac460e58d1e064e6bd2de5e57",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.3||^7.0",
"php": "^7.1||^8.0",
"psr/http-client": "^1.0"
},
"type": "library",
"autoload": {
"psr-4": {
"DivineOmega\\PasswordExposed\\": "src/"
},
"files": [
"src/PasswordExposedFunction.php"
]
"DivineOmega\\Psr18GuzzleAdapter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -550,8 +613,14 @@
"email": "jordan@hall05.co.uk"
}
],
"description": "This PHP package provides a `password_exposed` helper function, that uses the haveibeenpwned.com API to check if a password has been exposed in a data breach.",
"time": "2019-01-25T12:00:28+00:00"
"description": "PSR-18 adapter for the Guzzle HTTP client",
"funding": [
{
"url": "https://github.com/DivineOmega",
"type": "github"
}
],
"time": "2021-04-20T08:50:57+00:00"
},
{
"name": "enyo/dropzone",
@ -871,37 +940,47 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "6.5.8",
"version": "7.8.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981",
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.9",
"php": ">=5.5",
"symfony/polyfill-intl-idn": "^1.17"
"guzzlehttp/promises": "^1.5.3 || ^2.0.1",
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
},
"provide": {
"psr/http-client-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
"psr/log": "^1.1"
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
"php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.36 || ^9.6.15",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
"ext-curl": "Required for CURL handler support",
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "6.5-dev"
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
@ -954,13 +1033,14 @@
}
],
"description": "Guzzle is a PHP HTTP client library",
"homepage": "http://guzzlephp.org/",
"keywords": [
"client",
"curl",
"framework",
"http",
"http client",
"psr-18",
"psr-7",
"rest",
"web service"
],
@ -978,7 +1058,7 @@
"type": "tidelift"
}
],
"time": "2022-06-20T22:16:07+00:00"
"time": "2023-12-03T20:35:24+00:00"
},
{
"name": "guzzlehttp/oauth-subscriber",
@ -1037,29 +1117,33 @@
},
{
"name": "guzzlehttp/promises",
"version": "1.5.3",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e"
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e",
"reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e",
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
"shasum": ""
},
"require": {
"php": ">=5.5"
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"symfony/phpunit-bridge": "^4.4 || ^5.1"
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.36 || ^9.6.15"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
}
@ -1108,42 +1192,48 @@
"type": "tidelift"
}
],
"time": "2023-05-21T12:31:43+00:00"
"time": "2023-12-03T20:19:20+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "1.9.1",
"version": "2.6.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b"
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b",
"reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.1 || ^2.0",
"ralouphie/getallheaders": "^3.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
"bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "^0.9",
"phpunit/phpunit": "^8.5.36 || ^9.6.15"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
}
@ -1182,6 +1272,11 @@
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://sagikazarmark.hu"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
@ -1209,7 +1304,7 @@
"type": "tidelift"
}
],
"time": "2023-04-17T16:00:37+00:00"
"time": "2023-12-03T20:05:35+00:00"
},
{
"name": "kornrunner/blurhash",
@ -2316,11 +2411,11 @@
},
{
"name": "npm-asset/moment",
"version": "2.29.4",
"version": "2.30.1",
"dist": {
"type": "tar",
"url": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"shasum": "3dbe052889fe7c1b2ed966fcb3a77328964ef108"
"url": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
"shasum": "f8c91c07b7a786e30c59926df530b4eac96974ae"
},
"type": "npm-asset-library",
"extra": {
@ -2394,7 +2489,7 @@
"time",
"validate"
],
"time": "2022-07-06T16:01:32+00:00"
"time": "2023-12-27T10:38:43+00:00"
},
{
"name": "npm-asset/perfect-scrollbar",
@ -2680,6 +2775,80 @@
],
"time": "2018-01-24T10:49:39+00:00"
},
{
"name": "nyholm/psr7",
"version": "1.8.1",
"source": {
"type": "git",
"url": "https://github.com/Nyholm/psr7.git",
"reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e",
"reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e",
"shasum": ""
},
"require": {
"php": ">=7.2",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.1 || ^2.0"
},
"provide": {
"php-http/message-factory-implementation": "1.0",
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"http-interop/http-factory-tests": "^0.9",
"php-http/message-factory": "^1.0",
"php-http/psr7-integration-tests": "^1.0",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
"symfony/error-handler": "^4.4"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.8-dev"
}
},
"autoload": {
"psr-4": {
"Nyholm\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com"
},
{
"name": "Martijn van der Ven",
"email": "martijn@vanderven.se"
}
],
"description": "A fast PHP7 implementation of PSR-7",
"homepage": "https://tnyholm.se",
"keywords": [
"psr-17",
"psr-7"
],
"funding": [
{
"url": "https://github.com/Zegnat",
"type": "github"
},
{
"url": "https://github.com/nyholm",
"type": "github"
}
],
"time": "2023-11-13T09:31:12+00:00"
},
{
"name": "paragonie/certainty",
"version": "v2.8.2",
@ -3083,17 +3252,91 @@
"time": "2018-01-25T20:47:17+00:00"
},
{
"name": "phpseclib/phpseclib",
"version": "3.0.34",
"name": "php-http/discovery",
"version": "1.19.2",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
"reference": "56c79f16a6ae17e42089c06a2144467acc35348a"
"url": "https://github.com/php-http/discovery.git",
"reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56c79f16a6ae17e42089c06a2144467acc35348a",
"reference": "56c79f16a6ae17e42089c06a2144467acc35348a",
"url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb",
"reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0|^2.0",
"php": "^7.1 || ^8.0"
},
"conflict": {
"nyholm/psr7": "<1.0",
"zendframework/zend-diactoros": "*"
},
"provide": {
"php-http/async-client-implementation": "*",
"php-http/client-implementation": "*",
"psr/http-client-implementation": "*",
"psr/http-factory-implementation": "*",
"psr/http-message-implementation": "*"
},
"require-dev": {
"composer/composer": "^1.0.2|^2.0",
"graham-campbell/phpspec-skip-example-extension": "^5.0",
"php-http/httplug": "^1.0 || ^2.0",
"php-http/message-factory": "^1.0",
"phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
"symfony/phpunit-bridge": "^6.2"
},
"type": "composer-plugin",
"extra": {
"class": "Http\\Discovery\\Composer\\Plugin",
"plugin-optional": true
},
"autoload": {
"psr-4": {
"Http\\Discovery\\": "src/"
},
"exclude-from-classmap": [
"src/Composer/Plugin.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com"
}
],
"description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
"homepage": "http://php-http.org",
"keywords": [
"adapter",
"client",
"discovery",
"factory",
"http",
"message",
"psr17",
"psr7"
],
"time": "2023-11-30T16:49:05+00:00"
},
{
"name": "phpseclib/phpseclib",
"version": "3.0.35",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
"reference": "4b1827beabce71953ca479485c0ae9c51287f2fe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4b1827beabce71953ca479485c0ae9c51287f2fe",
"reference": "4b1827beabce71953ca479485c0ae9c51287f2fe",
"shasum": ""
},
"require": {
@ -3186,7 +3429,7 @@
"type": "tidelift"
}
],
"time": "2023-11-27T11:13:31+00:00"
"time": "2023-12-29T01:59:53+00:00"
},
{
"name": "pragmarx/google2fa",
@ -3922,128 +4165,35 @@
"time": "2020-11-03T09:10:25+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.28.0",
"name": "symfony/deprecation-contracts",
"version": "v2.5.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "ecaafce9f77234a6a449d29e49267ba10499116d"
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d",
"reference": "ecaafce9f77234a6a449d29e49267ba10499116d",
"shasum": ""
},
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Idn\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laurent Bassin",
"email": "laurent@bassin.info"
},
{
"name": "Trevor Rowbotham",
"email": "trevor.rowbotham@pm.me"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"idn",
"intl",
"polyfill",
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-01-26T09:30:37+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Normalizer\\": ""
},
"classmap": [
"Resources/stubs"
"function.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@ -4060,16 +4210,8 @@
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's Normalizer class and related functions",
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"intl",
"normalizer",
"polyfill",
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
@ -4084,7 +4226,7 @@
"type": "tidelift"
}
],
"time": "2023-01-26T09:26:14+00:00"
"time": "2022-01-02T09:53:40+00:00"
},
{
"name": "symfony/polyfill-php56",
@ -4151,79 +4293,6 @@
],
"time": "2020-10-23T14:02:19+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
"reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php72\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-01-26T09:26:14+00:00"
},
{
"name": "ua-parser/uap-php",
"version": "v3.9.14",
@ -5024,25 +5093,27 @@
},
{
"name": "nikic/php-parser",
"version": "v4.18.0",
"version": "v5.0.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
"reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc",
"reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-json": "*",
"ext-tokenizer": "*",
"php": ">=7.0"
"php": ">=7.4"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
@ -5050,7 +5121,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
"dev-master": "5.0-dev"
}
},
"autoload": {
@ -5072,7 +5143,7 @@
"parser",
"php"
],
"time": "2023-12-10T21:03:43+00:00"
"time": "2024-01-07T17:17:35+00:00"
},
{
"name": "phar-io/manifest",
@ -5179,23 +5250,23 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.29",
"version": "9.2.30",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76"
"reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76",
"reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089",
"reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.15",
"nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
@ -5248,7 +5319,7 @@
"type": "github"
}
],
"time": "2023-09-19T04:57:46+00:00"
"time": "2023-12-22T06:47:57+00:00"
},
{
"name": "phpunit/php-file-iterator",
@ -5800,20 +5871,20 @@
},
{
"name": "sebastian/complexity",
"version": "2.0.2",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
"reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
"reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.7",
"nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@ -5849,7 +5920,7 @@
"type": "github"
}
],
"time": "2020-10-26T15:52:27+00:00"
"time": "2023-12-22T06:19:30+00:00"
},
{
"name": "sebastian/diff",
@ -6107,20 +6178,20 @@
},
{
"name": "sebastian/lines-of-code",
"version": "1.0.3",
"version": "1.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
"reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.6",
"nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@ -6156,7 +6227,7 @@
"type": "github"
}
],
"time": "2020-11-28T06:42:11+00:00"
"time": "2023-12-22T06:20:34+00:00"
},
{
"name": "sebastian/object-enumerator",

View File

@ -58,7 +58,7 @@ class User extends \Asika\SimpleConsole\Console
console user - Modify user settings per console commands.
Usage
bin/console user password <nickname> [<password>] [-h|--help|-?] [-v]
bin/console user add [<name> [<nickname> [<email> [<language>]]]] [-h|--help|-?] [-v]
bin/console user add [<name> [<nickname> [<email> [<language> [<avatar_url>]]]]] [-h|--help|-?] [-v]
bin/console user delete [<nickname>] [-y] [-h|--help|-?] [-v]
bin/console user allow [<nickname>] [-h|--help|-?] [-v]
bin/console user deny [<nickname>] [-h|--help|-?] [-v]
@ -228,10 +228,11 @@ HELP;
*/
private function addUser()
{
$name = $this->getArgument(1);
$nick = $this->getArgument(2);
$email = $this->getArgument(3);
$lang = $this->getArgument(4);
$name = $this->getArgument(1);
$nick = $this->getArgument(2);
$email = $this->getArgument(3);
$lang = $this->getArgument(4);
$avatar = $this->getArgument(5);
if (empty($name)) {
$this->out($this->l10n->t('Enter user name: '));
@ -262,10 +263,15 @@ HELP;
$lang = CliPrompt::prompt();
}
if (empty($avatar)) {
$this->out($this->l10n->t('Enter URL of an image to use as avatar (optional): '));
$avatar = CliPrompt::prompt();
}
if (empty($lang)) {
return UserModel::createMinimal($name, $email, $nick);
} else {
return UserModel::createMinimal($name, $email, $nick, $lang);
return UserModel::createMinimal($name, $email, $nick, $lang, $avatar);
}
}

View File

@ -80,7 +80,7 @@ class Avatar
return $fields;
}
$img_str = $fetchResult->getBody();
$img_str = $fetchResult->getBodyString();
if (empty($img_str)) {
Logger::debug('Avatar is invalid', ['avatar' => $avatar]);
return $fields;

View File

@ -383,7 +383,7 @@ class Item
'url' => $item['author-link'],
'alias' => $item['author-alias'],
];
$profile_link = Contact::magicLinkByContact($author, $item['author-link']);
$profile_link = Contact::magicLinkByContact($author, Contact::getProfileLink($author));
if (strpos($profile_link, 'contact/redir/') === 0) {
$status_link = $profile_link . '?' . http_build_query(['url' => $item['author-link'] . '/status']);
$photos_link = $profile_link . '?' . http_build_query(['url' => $item['author-link'] . '/photos']);

View File

@ -120,7 +120,7 @@ class OEmbed
['https://www.youtube.com/', 'https://player.vimeo.com/'], $href);
$result = DI::httpClient()->fetchFull($href . '&maxwidth=' . $a->getThemeInfoValue('videowidth'));
if ($result->getReturnCode() === 200) {
$json_string = $result->getBody();
$json_string = $result->getBodyString();
break;
}
}

View File

@ -45,19 +45,21 @@ class Hovercard
$actions = [];
}
$contact_url = Contact::getProfileLink($contact);
// Move the contact data to the profile array so we can deliver it to
$tpl = Renderer::getMarkupTemplate('hovercard.tpl');
return Renderer::replaceMacros($tpl, [
'$profile' => [
'name' => $contact['name'],
'nick' => $contact['nick'],
'addr' => $contact['addr'] ?: $contact['url'],
'addr' => $contact['addr'] ?: $contact_url,
'thumb' => Contact::getThumb($contact),
'url' => Contact::magicLinkByContact($contact),
'nurl' => $contact['nurl'],
'location' => $contact['location'],
'about' => $contact['about'],
'network_link' => Strings::formatNetworkName($contact['network'], $contact['url']),
'network_link' => Strings::formatNetworkName($contact['network'], $contact_url),
'tags' => $contact['keywords'],
'bd' => $contact['bd'] <= DBA::NULL_DATE ? '' : $contact['bd'],
'account_type' => Contact::getAccountType($contact['contact-type']),

View File

@ -50,11 +50,7 @@ class VCard
Logger::warning('Incomplete contact', ['contact' => $contact ?? []]);
}
if (!Network::isValidHttpUrl($contact['url']) && Network::isValidHttpUrl($contact['alias'])) {
$contact_url = $contact['alias'];
} else {
$contact_url = $contact['url'];
}
$contact_url = Contact::getProfileLink($contact);
if ($contact['network'] != '') {
$network_link = Strings::formatNetworkName($contact['network'], $contact_url);

View File

@ -263,7 +263,7 @@ class ErrorHandler
public function handleError(int $code, string $message, string $file = '', int $line = 0, ?array $context = []): bool
{
if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) {
return false;
return true;
}
// fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries

View File

@ -234,7 +234,7 @@ class Search
$p = $page > 1 ? 'p=' . $page : '';
$curlResult = DI::httpClient()->get(self::getGlobalDirectory() . '/search/people?' . $p . '&q=' . urlencode($search), HttpClientAccept::JSON);
if ($curlResult->isSuccess()) {
$searchResult = json_decode($curlResult->getBody(), true);
$searchResult = json_decode($curlResult->getBodyString(), true);
if (!empty($searchResult['profiles'])) {
// Converting Directory Search results into contact-looking records
$return = array_map(function ($result) {

View File

@ -70,12 +70,12 @@ class ExternalResource implements ICanReadFromStorage
}
if (!empty($fetchResult) && $fetchResult->isSuccess()) {
$this->logger->debug('Got picture', ['Content-Type' => $fetchResult->getHeader('Content-Type'), 'uid' => $data->uid, 'url' => $data->url]);
return $fetchResult->getBody();
return $fetchResult->getBodyString();
} else {
if (empty($fetchResult)) {
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference));
} else {
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $fetchResult->getReturnCode(), new Exception($fetchResult->getBody()));
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $fetchResult->getReturnCode(), new Exception($fetchResult->getBodyString()));
}
}
}

View File

@ -198,11 +198,11 @@ class APContact
try {
$curlResult = HTTPSignature::fetchRaw($url);
$failed = empty($curlResult) || empty($curlResult->getBody()) ||
$failed = empty($curlResult) || empty($curlResult->getBodyString()) ||
(!$curlResult->isSuccess() && ($curlResult->getReturnCode() != 410));
if (!$failed) {
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
$failed = empty($data) || !is_array($data);
}

View File

@ -2305,7 +2305,7 @@ class Contact
try {
$fetchResult = HTTPSignature::fetchRaw($avatar, 0, [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::IMAGE]]);
$img_str = $fetchResult->getBody();
$img_str = $fetchResult->getBodyString();
if (!empty($img_str)) {
$image = new Image($img_str, Images::getMimeTypeByData($img_str));
if ($image->isValid()) {
@ -3495,6 +3495,21 @@ class Contact
return array_column($contacts, 'id');
}
/**
* Return the link to the profile
*
* @param array $contact
* @return string
*/
public static function getProfileLink(array $contact): string
{
if (!empty($contact['alias']) && Network::isValidHttpUrl($contact['alias']) && (($contact['network'] ?? '') != Protocol::DFRN)) {
return $contact['alias'];
} else {
return $contact['url'];
}
}
/**
* Returns a magic link to authenticate remote visitors
*
@ -3553,7 +3568,7 @@ class Contact
*/
public static function magicLinkByContact(array $contact, string $url = ''): string
{
$destination = $url ?: (!Network::isValidHttpUrl($contact['url']) && !empty($contact['alias']) && Network::isValidHttpUrl($contact['alias']) ? $contact['alias'] : $contact['url']);
$destination = $url ?: self::getProfileLink($contact);
if (!DI::userSession()->isAuthenticated()) {
return $destination;

View File

@ -649,7 +649,7 @@ class GServer
}
if ($curlResult->isSuccess()) {
$json = json_decode($curlResult->getBody(), true);
$json = json_decode($curlResult->getBodyString(), true);
if (!empty($json) && is_array($json)) {
$data = self::fetchDataFromSystemActor($json, $serverdata);
$serverdata = $data['server'];
@ -657,7 +657,7 @@ class GServer
if (!$html_fetched && !in_array($serverdata['detection-method'], [self::DETECT_SYSTEM_ACTOR, self::DETECT_AP_COLLECTION])) {
$curlResult = DI::httpClient()->get($url, HttpClientAccept::HTML);
}
} elseif (!$html_fetched && (strlen($curlResult->getBody()) < 1000)) {
} elseif (!$html_fetched && (strlen($curlResult->getBodyString()) < 1000)) {
$curlResult = DI::httpClient()->get($url, HttpClientAccept::HTML);
}
@ -667,7 +667,7 @@ class GServer
}
}
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
self::setFailureByUrl($url);
return false;
}
@ -872,7 +872,7 @@ class GServer
return;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (!is_array($data)) {
return;
}
@ -967,7 +967,7 @@ class GServer
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1059,7 +1059,7 @@ class GServer
return [];
}
$nodeinfo = json_decode($httpResult->getBody(), true);
$nodeinfo = json_decode($httpResult->getBodyString(), true);
if (!is_array($nodeinfo) || empty($nodeinfo['links'])) {
return [];
@ -1114,7 +1114,7 @@ class GServer
return [];
}
$nodeinfo = json_decode($curlResult->getBody(), true);
$nodeinfo = json_decode($curlResult->getBodyString(), true);
if (!is_array($nodeinfo)) {
return [];
@ -1214,7 +1214,7 @@ class GServer
return [];
}
$nodeinfo = json_decode($curlResult->getBody(), true);
$nodeinfo = json_decode($curlResult->getBodyString(), true);
if (!is_array($nodeinfo)) {
return [];
}
@ -1331,7 +1331,7 @@ class GServer
return [];
}
$nodeinfo = json_decode($httpResult->getBody(), true);
$nodeinfo = json_decode($httpResult->getBodyString(), true);
if (!is_array($nodeinfo)) {
return [];
@ -1434,7 +1434,7 @@ class GServer
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1587,11 +1587,11 @@ class GServer
{
$name = 'nomad';
$curlResult = DI::httpClient()->get($url . '/manifest', 'application/manifest+json');
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return $name;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $name;
}
@ -1608,11 +1608,11 @@ class GServer
private static function getNomadVersion(string $url): string
{
$curlResult = DI::httpClient()->get($url . '/api/z/1.0/version', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return '';
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return '';
}
@ -1634,7 +1634,7 @@ class GServer
return false;
}
$xrd = XML::parseString($curlResult->getBody(), true);
$xrd = XML::parseString($curlResult->getBodyString(), true);
if (!is_object($xrd)) {
return false;
}
@ -1733,7 +1733,7 @@ class GServer
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1763,7 +1763,7 @@ class GServer
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1786,11 +1786,11 @@ class GServer
private static function detectPeertube(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/config', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1834,11 +1834,11 @@ class GServer
private static function detectNextcloud(string $url, array $serverdata, bool $validHostMeta): array
{
$curlResult = DI::httpClient()->get($url . '/status.php', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1870,11 +1870,11 @@ class GServer
private static function fetchWeeklyUsage(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/instance/activity', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1910,11 +1910,11 @@ class GServer
private static function detectMastodonAlikes(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/instance', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data)) {
return $serverdata;
}
@ -1982,11 +1982,11 @@ class GServer
private static function detectHubzilla(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/statusnet/config.json', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
if (!$curlResult->isSuccess() || ($curlResult->getBodyString() == '')) {
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data) || empty($data['site'])) {
return $serverdata;
}
@ -2079,11 +2079,11 @@ class GServer
{
// Test for GNU Social
$curlResult = DI::httpClient()->get($url . '/api/gnusocial/version.json', HttpClientAccept::JSON);
if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
if ($curlResult->isSuccess() && ($curlResult->getBodyString() != '{"error":"not implemented"}') &&
($curlResult->getBodyString() != '') && (strlen($curlResult->getBodyString()) < 30)) {
$serverdata['platform'] = 'gnusocial';
// Remove junk that some GNU Social servers return
$serverdata['version'] = str_replace(chr(239) . chr(187) . chr(191), '', $curlResult->getBody());
$serverdata['version'] = str_replace(chr(239) . chr(187) . chr(191), '', $curlResult->getBodyString());
$serverdata['version'] = str_replace(["\r", "\n", "\t"], '', $serverdata['version']);
$serverdata['version'] = trim($serverdata['version'], '"');
$serverdata['network'] = Protocol::OSTATUS;
@ -2097,11 +2097,11 @@ class GServer
// Test for Statusnet
$curlResult = DI::httpClient()->get($url . '/api/statusnet/version.json', HttpClientAccept::JSON);
if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
if ($curlResult->isSuccess() && ($curlResult->getBodyString() != '{"error":"not implemented"}') &&
($curlResult->getBodyString() != '') && (strlen($curlResult->getBodyString()) < 30)) {
// Remove junk that some GNU Social servers return
$serverdata['version'] = str_replace(chr(239).chr(187).chr(191), '', $curlResult->getBody());
$serverdata['version'] = str_replace(chr(239).chr(187).chr(191), '', $curlResult->getBodyString());
$serverdata['version'] = str_replace(["\r", "\n", "\t"], '', $serverdata['version']);
$serverdata['version'] = trim($serverdata['version'], '"');
@ -2148,7 +2148,7 @@ class GServer
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
$data = json_decode($curlResult->getBodyString(), true);
if (empty($data) || empty($data['version'])) {
return $serverdata;
}
@ -2466,7 +2466,7 @@ class GServer
$api = 'https://instances.social/api/1.0/instances/list?count=0';
$curlResult = DI::httpClient()->get($api, HttpClientAccept::JSON, [HttpClientOptions::HEADERS => ['Authorization' => ['Bearer ' . $accesstoken]]]);
if ($curlResult->isSuccess()) {
$servers = json_decode($curlResult->getBody(), true);
$servers = json_decode($curlResult->getBodyString(), true);
if (!empty($servers['instances'])) {
foreach ($servers['instances'] as $server) {

View File

@ -597,7 +597,7 @@ class Photo
if (!empty($image_url)) {
$ret = DI::httpClient()->get($image_url, HttpClientAccept::IMAGE);
Logger::debug('Got picture', ['Content-Type' => $ret->getHeader('Content-Type'), 'url' => $image_url]);
$img_str = $ret->getBody();
$img_str = $ret->getBodyString();
$type = $ret->getContentType();
} else {
$img_str = '';
@ -1047,7 +1047,7 @@ class Photo
if (!empty($image_url)) {
$ret = DI::httpClient()->get($image_url, HttpClientAccept::IMAGE);
Logger::debug('Got picture', ['Content-Type' => $ret->getHeader('Content-Type'), 'url' => $image_url]);
$img_str = $ret->getBody();
$img_str = $ret->getBodyString();
$type = $ret->getContentType();
} else {
$img_str = '';

View File

@ -135,7 +135,7 @@ class Link
}
$fields = ['mimetype' => $curlResult->getHeader('Content-Type')[0]];
$img_str = $curlResult->getBody();
$img_str = $curlResult->getBodyString();
$image = new Image($img_str, Images::getMimeTypeByData($img_str));
if ($image->isValid()) {
$fields['mimetype'] = $image->getType();

View File

@ -208,13 +208,17 @@ class Media
$filetype = !empty($media['mimetype']) ? strtolower(current(explode('/', $media['mimetype']))) : '';
if (($media['type'] == self::IMAGE) || ($filetype == 'image')) {
$imagedata = Images::getInfoFromURLCached($media['url']);
$imagedata = Images::getInfoFromURLCached($media['url'], empty($media['description']));
if ($imagedata) {
$media['mimetype'] = $imagedata['mime'];
$media['size'] = $imagedata['size'];
$media['width'] = $imagedata[0];
$media['height'] = $imagedata[1];
$media['blurhash'] = $imagedata['blurhash'] ?? null;
if (!empty($imagedata['description']) && empty($media['description'])) {
$media['description'] = $imagedata['description'];
Logger::debug('Detected text for image', $media);
}
} else {
Logger::notice('No image data', ['media' => $media]);
}

View File

@ -1393,7 +1393,7 @@ class User
$curlResult = DI::httpClient()->get($photo, HttpClientAccept::IMAGE);
if ($curlResult->isSuccess()) {
Logger::debug('Got picture', ['Content-Type' => $curlResult->getHeader('Content-Type'), 'url' => $photo]);
$img_str = $curlResult->getBody();
$img_str = $curlResult->getBodyString();
$type = $curlResult->getContentType();
} else {
$img_str = '';
@ -1563,16 +1563,17 @@ class User
/**
* Creates a new user based on a minimal set and sends an email to this user
*
* @param string $name The user's name
* @param string $email The user's email address
* @param string $nick The user's nick name
* @param string $lang The user's language (default is english)
* @param string $name The user's name
* @param string $email The user's email address
* @param string $nick The user's nick name
* @param string $lang The user's language (default is english)
* @param string $avatar URL to an image to use as avatar (default is to prompt user at first login)
* @return bool True, if the user was created successfully
* @throws HTTPException\InternalServerErrorException
* @throws ErrorException
* @throws ImagickException
*/
public static function createMinimal(string $name, string $email, string $nick, string $lang = L10n::DEFAULT): bool
public static function createMinimal(string $name, string $email, string $nick, string $lang = L10n::DEFAULT, string $avatar = ''): bool
{
if (empty($name) ||
empty($email) ||
@ -1585,7 +1586,8 @@ class User
'email' => $email,
'nickname' => $nick,
'verified' => 1,
'language' => $lang
'language' => $lang,
'photo' => $avatar
]);
$user = $result['user'];

View File

@ -132,7 +132,7 @@ class MatchInterests extends BaseModule
}
}
$entries = $this->parseContacts(json_decode($result->getBody()), $entries, $limit);
$entries = $this->parseContacts(json_decode($result->getBodyString()), $entries, $limit);
}
if (empty($entries)) {

View File

@ -132,8 +132,8 @@ class Community extends Timeline
$pager = new BoundariesPager(
$this->l10n,
$this->args->getQueryString(),
$items[0]['received'],
$items[count($items) - 1]['received'],
$items[array_key_first($items)]['received'],
$items[array_key_last($items)]['received'],
$this->itemsPerPage
);

View File

@ -155,7 +155,7 @@ class Magic extends BaseModule
System::externalRedirect($dest);
}
$j = json_decode($curlResult->getBody(), true);
$j = json_decode($curlResult->getBodyString(), true);
if (empty($j) || !$j['success']) {
$this->logger->notice('Invalid JSON, redirecting to destination.', ['json' => $j, 'dest' => $dest]);
$this->app->redirect($dest);

View File

@ -154,7 +154,7 @@ class PubSubHubBub extends \Friendica\BaseModule
$separator = parse_url($hub_callback, PHP_URL_QUERY) === null ? '?' : '&';
$fetchResult = $this->httpClient->fetchFull($hub_callback . $separator . $params);
$body = $fetchResult->getBody();
$body = $fetchResult->getBodyString();
$returnCode = $fetchResult->getReturnCode();
// give up if the HTTP return code wasn't a success (2xx)

View File

@ -96,7 +96,7 @@ class Subscribe extends \Friendica\BaseModule
return $o . $this->t('Couldn\'t fetch friends for contact.');
}
$friends = $curlResult->getBody();
$friends = $curlResult->getBodyString();
if (empty($friends)) {
$this->pConfig->delete($uid, 'ostatus', 'legacy_contact');
return $o . $this->t('Couldn\'t fetch following contacts.');

View File

@ -85,7 +85,7 @@ class Proxy extends BaseModule
// Fetch the content with the local user
try {
$fetchResult = HTTPSignature::fetchRaw($request['url'], DI::userSession()->getLocalUserId(), [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::IMAGE], 'timeout' => 10]);
$img_str = $fetchResult->getBody();
$img_str = $fetchResult->getBodyString();
if (!$fetchResult->isSuccess() || empty($img_str)) {
Logger::notice('Error fetching image', ['image' => $request['url'], 'return' => $fetchResult->getReturnCode(), 'empty' => empty($img_str)]);

View File

@ -97,10 +97,9 @@ interface ICanHandleHttpResponses
/**
* Getter for body
*
* @see MessageInterface::getBody()
* @return string
*/
public function getBody();
public function getBodyString();
/**
* @return boolean

View File

@ -73,7 +73,7 @@ class HttpClient implements ICanSendHttpRequests
throw new \InvalidArgumentException('Unable to retrieve the host in URL: ' . $url);
}
if(!filter_var($host, FILTER_VALIDATE_IP) && !@dns_get_record($host . '.', DNS_A + DNS_AAAA)) {
if(!filter_var($host, FILTER_VALIDATE_IP) && !@dns_get_record($host . '.', DNS_A) && !@dns_get_record($host . '.', DNS_AAAA)) {
$this->logger->debug('URL cannot be resolved.', ['url' => $url]);
$this->profiler->stopRecording();
return CurlResult::createErrorCurl($this->logger, $url);
@ -271,7 +271,7 @@ class HttpClient implements ICanSendHttpRequests
{
$ret = $this->fetchFull($url, $accept_content, $timeout, $cookiejar);
return $ret->getBody();
return $ret->getBodyString();
}
/**

View File

@ -330,7 +330,7 @@ class CurlResult implements ICanHandleHttpResponses
}
/** {@inheritDoc} */
public function getBody(): string
public function getBodyString(): string
{
return $this->body;
}

View File

@ -163,8 +163,7 @@ class GuzzleResponse extends Response implements ICanHandleHttpResponses, Respon
return $this->isTimeout;
}
/// @todo - fix mismatching use of "getBody()" as string here and parent "getBody()" as streaminterface
public function getBody(): string
public function getBodyString(): string
{
return (string) parent::getBody();
}

View File

@ -225,7 +225,7 @@ class Probe
$curlResult = DI::httpClient()->get($ssl_url, HttpClientAccept::XRD_XML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
$ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
if ($curlResult->isSuccess()) {
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
$xrd = XML::parseString($xml, true);
if (!empty($url)) {
$host_url = 'https://' . $host;
@ -250,7 +250,7 @@ class Probe
return [];
}
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
$xrd = XML::parseString($xml, true);
$host_url = 'http://'.$host;
}
@ -459,7 +459,7 @@ class Probe
return false;
}
$body = $curlResult->getBody();
$body = $curlResult->getBodyString();
if (empty($body)) {
return false;
}
@ -865,7 +865,7 @@ class Probe
if ($curlResult->isTimeout()) {
return $data;
}
$content = $curlResult->getBody();
$content = $curlResult->getBodyString();
if (!$content) {
return $data;
}
@ -971,7 +971,7 @@ class Probe
self::$isTimeout = true;
return [];
}
$data = $curlResult->getBody();
$data = $curlResult->getBodyString();
$webfinger = json_decode($data, true);
if (!empty($webfinger)) {
@ -1040,7 +1040,7 @@ class Probe
self::$isTimeout = true;
return $data;
}
$content = $curlResult->getBody();
$content = $curlResult->getBodyString();
if (!$content) {
Logger::info('Empty body', ['url' => $noscrape_url]);
return $data;
@ -1303,7 +1303,7 @@ class Probe
self::$isTimeout = true;
return [];
}
$content = $curlResult->getBody();
$content = $curlResult->getBodyString();
if (empty($content)) {
return [];
}
@ -1580,7 +1580,7 @@ class Probe
return $short ? false : [];
}
Logger::debug('Fetched public key', ['Content-Type' => $curlResult->getHeader('Content-Type'), 'url' => $pubkey]);
$pubkey = $curlResult->getBody();
$pubkey = $curlResult->getBodyString();
}
try {
@ -1612,7 +1612,7 @@ class Probe
self::$isTimeout = true;
return [];
}
$feed = $curlResult->getBody();
$feed = $curlResult->getBodyString();
$feed_data = Feed::import($feed);
if (!$feed_data) {
return [];
@ -1660,12 +1660,12 @@ class Probe
private static function pumpioProfileData(string $profile_link, string $baseurl): array
{
$curlResult = DI::httpClient()->get($profile_link, HttpClientAccept::HTML);
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
return [];
}
$doc = new DOMDocument();
if (!@$doc->loadHTML($curlResult->getBody())) {
if (!@$doc->loadHTML($curlResult->getBodyString())) {
return [];
}
@ -1887,7 +1887,7 @@ class Probe
return [];
}
$feed = $curlResult->getBody();
$feed = $curlResult->getBodyString();
$feed_data = Feed::import($feed);
if (!$feed_data) {
@ -2112,8 +2112,8 @@ class Probe
$curlResult = DI::httpClient()->get($gserver['noscrape'] . '/' . $data['nick'], HttpClientAccept::JSON);
if ($curlResult->isSuccess() && !empty($curlResult->getBody())) {
$noscrape = json_decode($curlResult->getBody(), true);
if ($curlResult->isSuccess() && !empty($curlResult->getBodyString())) {
$noscrape = json_decode($curlResult->getBodyString(), true);
if (!empty($noscrape) && !empty($noscrape['updated'])) {
return DateTimeFormat::utc($noscrape['updated'], DateTimeFormat::MYSQL);
}
@ -2187,12 +2187,12 @@ class Probe
{
// Search for the newest entry in the feed
$curlResult = DI::httpClient()->get($data['poll'], HttpClientAccept::ATOM_XML);
if (!$curlResult->isSuccess() || !$curlResult->getBody()) {
if (!$curlResult->isSuccess() || !$curlResult->getBodyString()) {
return '';
}
$doc = new DOMDocument();
@$doc->loadXML($curlResult->getBody());
@$doc->loadXML($curlResult->getBodyString());
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');

View File

@ -614,7 +614,7 @@ class Processor
}
if ($curlResult->isSuccess()) {
$object = json_decode($curlResult->getBody(), true);
$object = json_decode($curlResult->getBodyString(), true);
if (!empty($object)) {
$activity = JsonLD::compact($object);
if (JsonLD::fetchElement($activity, '@type') == 'as:Tombstone') {
@ -1584,7 +1584,7 @@ class Processor
return '';
}
$body = $curlResult->getBody();
$body = $curlResult->getBodyString();
if (!$curlResult->isSuccess() || empty($body)) {
if (in_array($curlResult->getReturnCode(), [403, 404, 406, 410])) {
return null;

View File

@ -1012,7 +1012,7 @@ class DFRN
$content_type = ($public_batch ? 'application/magic-envelope+xml' : 'application/json');
$postResult = DI::httpClient()->post($dest_url, $envelope, ['Content-Type' => $content_type]);
$xml = $postResult->getBody();
$xml = $postResult->getBodyString();
$curl_stat = $postResult->getReturnCode();
if (!empty($contact['gsid']) && ($postResult->isTimeout() || empty($curl_stat))) {

View File

@ -736,7 +736,7 @@ class OStatus
$stored = false;
$curlResult = DI::httpClient()->get($related, HttpClientAccept::ATOM_XML);
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
return;
}
@ -745,12 +745,12 @@ class OStatus
if ($curlResult->inHeader('Content-Type') &&
in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) {
Logger::info('Directly fetched XML for URI ' . $related_uri);
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
}
if ($xml == '') {
$doc = new DOMDocument();
if (!@$doc->loadHTML($curlResult->getBody())) {
if (!@$doc->loadHTML($curlResult->getBodyString())) {
return;
}
$xpath = new DOMXPath($doc);
@ -770,7 +770,7 @@ class OStatus
if ($curlResult->isSuccess()) {
Logger::info('Fetched XML for URI ' . $related_uri);
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
}
}
}
@ -782,7 +782,7 @@ class OStatus
if ($curlResult->isSuccess()) {
Logger::info('GNU Social workaround to fetch XML for URI ' . $related_uri);
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
}
}
@ -793,7 +793,7 @@ class OStatus
if ($curlResult->isSuccess()) {
Logger::info('GNU Social workaround 2 to fetch XML for URI ' . $related_uri);
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
}
}

View File

@ -250,7 +250,7 @@ class ExAuth
return false;
}
$json = @json_decode($curlResult->getBody());
$json = @json_decode($curlResult->getBodyString());
if (!is_object($json)) {
return false;
}

View File

@ -433,12 +433,12 @@ class HTTPSignature
return [];
}
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
Logger::debug('Fetching was unsuccessful', ['url' => $request, 'return-code' => $curlResult->getReturnCode(), 'error-number' => $curlResult->getErrorNumber(), 'error' => $curlResult->getError()]);
return [];
}
$content = json_decode($curlResult->getBody(), true);
$content = json_decode($curlResult->getBodyString(), true);
if (empty($content) || !is_array($content)) {
return [];
}

View File

@ -21,6 +21,7 @@
namespace Friendica\Util;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\DI;
use Friendica\Model\Photo;
@ -181,10 +182,11 @@ class Images
* Gets info array from given URL, cached data has priority
*
* @param string $url
* @param bool $ocr
* @return array Info
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function getInfoFromURLCached(string $url): array
public static function getInfoFromURLCached(string $url, bool $ocr = false): array
{
$data = [];
@ -192,12 +194,12 @@ class Images
return $data;
}
$cacheKey = 'getInfoFromURL:' . sha1($url);
$cacheKey = 'getInfoFromURL:' . sha1($url . $ocr);
$data = DI::cache()->get($cacheKey);
if (empty($data) || !is_array($data)) {
$data = self::getInfoFromURL($url);
$data = self::getInfoFromURL($url, $ocr);
DI::cache()->set($cacheKey, $data);
}
@ -209,10 +211,11 @@ class Images
* Gets info from URL uncached
*
* @param string $url
* @param bool $ocr
* @return array Info array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function getInfoFromURL(string $url): array
public static function getInfoFromURL(string $url, bool $ocr = false): array
{
$data = [];
@ -257,6 +260,14 @@ class Images
if ($image->isValid()) {
$data['blurhash'] = $image->getBlurHash();
if ($ocr) {
$media = ['img_str' => $img_str];
Hook::callAll('ocr-detection', $media);
if (!empty($media['description'])) {
$data['description'] = $media['description'];
}
}
}
$data['size'] = $filesize;

View File

@ -238,7 +238,7 @@ class ParseUrl
}
$curlResult = DI::httpClient()->get($url, HttpClientAccept::HTML, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
Logger::info('Empty body or error when fetching', ['url' => $url, 'success' => $curlResult->isSuccess(), 'code' => $curlResult->getReturnCode()]);
return $siteinfo;
}
@ -252,7 +252,7 @@ class ParseUrl
}
}
$body = $curlResult->getBody();
$body = $curlResult->getBodyString();
if ($do_oembed) {
$oembed_data = OEmbed::fetchURL($url, false, false);

View File

@ -70,7 +70,7 @@ class CheckRelMeProfileLink
return;
}
$content = $curlResult->getBody();
$content = $curlResult->getBodyString();
if (!$content) {
Logger::notice('Empty body of the fetched homepage link). Cannot verify the relation to profile of UID %s.', ['uid' => $uid, 'owner homepage' => $owner['homepage']]);
return;

View File

@ -172,7 +172,7 @@ class OnePoll
return false;
}
$xml = $curlResult->getBody();
$xml = $curlResult->getBodyString();
if (empty($xml)) {
Logger::notice('Empty content', ['id' => $contact['id'], 'url' => $contact['poll']]);
return false;

View File

@ -45,12 +45,12 @@ class UpdateServerPeers
}
$ret = DI::httpClient()->get($url . '/api/v1/instance/peers', HttpClientAccept::JSON);
if (!$ret->isSuccess() || empty($ret->getBody())) {
if (!$ret->isSuccess() || empty($ret->getBodyString())) {
Logger::info('Server is not reachable or does not offer the "peers" endpoint', ['url' => $url]);
return;
}
$peers = json_decode($ret->getBody());
$peers = json_decode($ret->getBodyString());
if (empty($peers) || !is_array($peers)) {
Logger::info('Server does not have any peers listed', ['url' => $url]);
return;

View File

@ -47,7 +47,7 @@ class CurlResultTest extends TestCase
self::assertFalse($curlResult->isTimeout());
self::assertFalse($curlResult->isRedirectUrl());
self::assertSame($headerArray, $curlResult->getHeaders());
self::assertSame($body, $curlResult->getBody());
self::assertSame($body, $curlResult->getBodyString());
self::assertSame('text/html; charset=utf-8', $curlResult->getContentType());
self::assertSame('https://test.local', $curlResult->getUrl());
self::assertSame('https://test.local', $curlResult->getRedirectUrl());
@ -76,7 +76,7 @@ class CurlResultTest extends TestCase
self::assertFalse($curlResult->isTimeout());
self::assertTrue($curlResult->isRedirectUrl());
self::assertSame($headerArray, $curlResult->getHeaders());
self::assertSame($body, $curlResult->getBody());
self::assertSame($body, $curlResult->getBodyString());
self::assertSame('text/html; charset=utf-8', $curlResult->getContentType());
self::assertSame('https://test.local/test/it', $curlResult->getUrl());
self::assertSame('https://test.other/test/it', $curlResult->getRedirectUrl());
@ -103,7 +103,7 @@ class CurlResultTest extends TestCase
self::assertTrue($curlResult->isTimeout());
self::assertFalse($curlResult->isRedirectUrl());
self::assertSame($headerArray, $curlResult->getHeaders());
self::assertSame($body, $curlResult->getBody());
self::assertSame($body, $curlResult->getBodyString());
self::assertSame('text/html; charset=utf-8', $curlResult->getContentType());
self::assertSame('https://test.local/test/it', $curlResult->getRedirectUrl());
self::assertSame('Tested error', $curlResult->getError());
@ -131,7 +131,7 @@ class CurlResultTest extends TestCase
self::assertFalse($curlResult->isTimeout());
self::assertTrue($curlResult->isRedirectUrl());
self::assertSame($headerArray, $curlResult->getHeaders());
self::assertSame($body, $curlResult->getBody());
self::assertSame($body, $curlResult->getBodyString());
self::assertSame('text/html; charset=utf-8', $curlResult->getContentType());
self::assertSame('https://test.local/test/it?key=value', $curlResult->getUrl());
self::assertSame('https://test.other/some/?key=value', $curlResult->getRedirectUrl());

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2024.03-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-01-07 19:57+0000\n"
"POT-Creation-Date: 2024-01-15 06:14+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -953,7 +953,7 @@ msgstr ""
msgid "All pending post updates are done."
msgstr ""
#: src/Console/User.php:158 src/Console/User.php:245
#: src/Console/User.php:158 src/Console/User.php:246
msgid "Enter user nickname: "
msgstr ""
@ -980,44 +980,48 @@ msgstr ""
msgid "Password changed."
msgstr ""
#: src/Console/User.php:237
#: src/Console/User.php:238
msgid "Enter user name: "
msgstr ""
#: src/Console/User.php:253
#: src/Console/User.php:254
msgid "Enter user email address: "
msgstr ""
#: src/Console/User.php:261
#: src/Console/User.php:262
msgid "Enter a language (optional): "
msgstr ""
#: src/Console/User.php:286
#: src/Console/User.php:267
msgid "Enter URL of an image to use as avatar (optional): "
msgstr ""
#: src/Console/User.php:292
msgid "User is not pending."
msgstr ""
#: src/Console/User.php:318
#: src/Console/User.php:324
msgid "User has already been marked for deletion."
msgstr ""
#: src/Console/User.php:323
#: src/Console/User.php:329
#, php-format
msgid "Type \"yes\" to delete %s"
msgstr ""
#: src/Console/User.php:325
#: src/Console/User.php:331
msgid "Deletion aborted."
msgstr ""
#: src/Console/User.php:450
#: src/Console/User.php:456
msgid "Enter category: "
msgstr ""
#: src/Console/User.php:460
#: src/Console/User.php:466
msgid "Enter key: "
msgstr ""
#: src/Console/User.php:494
#: src/Console/User.php:500
msgid "Enter value: "
msgstr ""
@ -1377,7 +1381,7 @@ msgstr ""
msgid "Public post"
msgstr ""
#: src/Content/Conversation.php:426 src/Content/Widget/VCard.php:131
#: src/Content/Conversation.php:426 src/Content/Widget/VCard.php:127
#: src/Model/Profile.php:483 src/Module/Admin/Logs/View.php:92
#: src/Module/Post/Edit.php:181
msgid "Message"
@ -1766,7 +1770,7 @@ msgstr ""
msgid "Create new group"
msgstr ""
#: src/Content/Item.php:332 src/Model/Item.php:3205
#: src/Content/Item.php:332 src/Model/Item.php:3234
msgid "event"
msgstr ""
@ -1774,7 +1778,7 @@ msgstr ""
msgid "status"
msgstr ""
#: src/Content/Item.php:341 src/Model/Item.php:3207
#: src/Content/Item.php:341 src/Model/Item.php:3236
#: src/Module/Post/Tag/Add.php:123
msgid "photo"
msgstr ""
@ -2176,39 +2180,39 @@ msgstr ""
msgid "last"
msgstr ""
#: src/Content/Text/BBCode.php:751 src/Content/Text/BBCode.php:1696
#: src/Content/Text/BBCode.php:1697
#: src/Content/Text/BBCode.php:755 src/Content/Text/BBCode.php:1700
#: src/Content/Text/BBCode.php:1701
msgid "Image/photo"
msgstr ""
#: src/Content/Text/BBCode.php:969
#: src/Content/Text/BBCode.php:973
#, php-format
msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:994 src/Model/Item.php:3938
#: src/Model/Item.php:3944 src/Model/Item.php:3945
#: src/Content/Text/BBCode.php:998 src/Model/Item.php:3967
#: src/Model/Item.php:3973 src/Model/Item.php:3974
msgid "Link to source"
msgstr ""
#: src/Content/Text/BBCode.php:1603 src/Content/Text/HTML.php:904
#: src/Content/Text/BBCode.php:1607 src/Content/Text/HTML.php:904
msgid "Click to open/close"
msgstr ""
#: src/Content/Text/BBCode.php:1636
#: src/Content/Text/BBCode.php:1640
msgid "$1 wrote:"
msgstr ""
#: src/Content/Text/BBCode.php:1701 src/Content/Text/BBCode.php:1702
#: src/Content/Text/BBCode.php:1705 src/Content/Text/BBCode.php:1706
msgid "Encrypted content"
msgstr ""
#: src/Content/Text/BBCode.php:1957
#: src/Content/Text/BBCode.php:1961
msgid "Invalid source protocol"
msgstr ""
#: src/Content/Text/BBCode.php:1976
#: src/Content/Text/BBCode.php:1980
msgid "Invalid link protocol"
msgstr ""
@ -2220,7 +2224,7 @@ msgstr ""
msgid "The end"
msgstr ""
#: src/Content/Text/HTML.php:859 src/Content/Widget/VCard.php:127
#: src/Content/Text/HTML.php:859 src/Content/Widget/VCard.php:123
#: src/Model/Profile.php:477 src/Module/Contact/Profile.php:471
msgid "Follow"
msgstr ""
@ -2420,27 +2424,27 @@ msgstr[1] ""
msgid "More Trending Tags"
msgstr ""
#: src/Content/Widget/VCard.php:106 src/Model/Contact.php:1209
#: src/Content/Widget/VCard.php:102 src/Model/Contact.php:1209
#: src/Model/Profile.php:461
msgid "Post to group"
msgstr ""
#: src/Content/Widget/VCard.php:110 src/Model/Contact.php:1214
#: src/Content/Widget/VCard.php:106 src/Model/Contact.php:1214
#: src/Model/Profile.php:466 src/Module/Moderation/Item/Source.php:85
msgid "Mention"
msgstr ""
#: src/Content/Widget/VCard.php:120 src/Model/Profile.php:380
#: src/Content/Widget/VCard.php:116 src/Model/Profile.php:380
#: src/Module/Contact/Profile.php:408 src/Module/Profile/Profile.php:199
msgid "XMPP:"
msgstr ""
#: src/Content/Widget/VCard.php:121 src/Model/Profile.php:381
#: src/Content/Widget/VCard.php:117 src/Model/Profile.php:381
#: src/Module/Contact/Profile.php:410 src/Module/Profile/Profile.php:203
msgid "Matrix:"
msgstr ""
#: src/Content/Widget/VCard.php:122 src/Model/Event.php:82
#: src/Content/Widget/VCard.php:118 src/Model/Event.php:82
#: src/Model/Event.php:109 src/Model/Event.php:471 src/Model/Event.php:963
#: src/Model/Profile.php:375 src/Module/Contact/Profile.php:406
#: src/Module/Directory.php:147 src/Module/Notifications/Introductions.php:187
@ -2448,18 +2452,18 @@ msgstr ""
msgid "Location:"
msgstr ""
#: src/Content/Widget/VCard.php:125 src/Model/Profile.php:490
#: src/Content/Widget/VCard.php:121 src/Model/Profile.php:490
#: src/Module/Notifications/Introductions.php:201
msgid "Network:"
msgstr ""
#: src/Content/Widget/VCard.php:129 src/Model/Contact.php:1242
#: src/Content/Widget/VCard.php:125 src/Model/Contact.php:1242
#: src/Model/Contact.php:1254 src/Model/Profile.php:479
#: src/Module/Contact/Profile.php:463
msgid "Unfollow"
msgstr ""
#: src/Content/Widget/VCard.php:135 src/Model/Contact.php:1211
#: src/Content/Widget/VCard.php:131 src/Model/Contact.php:1211
#: src/Model/Profile.php:463
msgid "View group"
msgstr ""
@ -2851,7 +2855,7 @@ msgstr ""
msgid "Could not connect to database."
msgstr ""
#: src/Core/L10n.php:441 src/Model/Item.php:2249
#: src/Core/L10n.php:441 src/Model/Item.php:2278
msgid "Undetermined"
msgstr ""
@ -3409,95 +3413,95 @@ msgstr ""
msgid "Happy Birthday %s"
msgstr ""
#: src/Model/Item.php:2256
#: src/Model/Item.php:2285
#, php-format
msgid "%s (%s - %s): %s"
msgstr ""
#: src/Model/Item.php:2258
#: src/Model/Item.php:2287
#, php-format
msgid "%s (%s): %s"
msgstr ""
#: src/Model/Item.php:2261
#: src/Model/Item.php:2290
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr ""
#: src/Model/Item.php:3209
#: src/Model/Item.php:3238
msgid "activity"
msgstr ""
#: src/Model/Item.php:3211
#: src/Model/Item.php:3240
msgid "comment"
msgstr ""
#: src/Model/Item.php:3214 src/Module/Post/Tag/Add.php:123
#: src/Model/Item.php:3243 src/Module/Post/Tag/Add.php:123
msgid "post"
msgstr ""
#: src/Model/Item.php:3384
#: src/Model/Item.php:3413
#, php-format
msgid "%s is blocked"
msgstr ""
#: src/Model/Item.php:3386
#: src/Model/Item.php:3415
#, php-format
msgid "%s is ignored"
msgstr ""
#: src/Model/Item.php:3388
#: src/Model/Item.php:3417
#, php-format
msgid "Content from %s is collapsed"
msgstr ""
#: src/Model/Item.php:3392
#: src/Model/Item.php:3421
#, php-format
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3845
#: src/Model/Item.php:3874
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3876
#: src/Model/Item.php:3905
#, php-format
msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3878
#: src/Model/Item.php:3907
#, php-format
msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3883
#: src/Model/Item.php:3912
#, php-format
msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3885
#: src/Model/Item.php:3914
#, php-format
msgid "%d voter."
msgid_plural "%d voters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3887
#: src/Model/Item.php:3916
#, php-format
msgid "Poll end: %s"
msgstr ""
#: src/Model/Item.php:3921 src/Model/Item.php:3922
#: src/Model/Item.php:3950 src/Model/Item.php:3951
msgid "View on separate page"
msgstr ""
#: src/Model/Mail.php:135
#: src/Model/Mail.php:137 src/Model/Mail.php:266
msgid "[no subject]"
msgstr ""
@ -3789,7 +3793,7 @@ msgstr ""
msgid "Profile Photos"
msgstr ""
#: src/Model/User.php:1592
#: src/Model/User.php:1594
#, php-format
msgid ""
"\n"
@ -3797,7 +3801,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you."
msgstr ""
#: src/Model/User.php:1595
#: src/Model/User.php:1597
#, php-format
msgid ""
"\n"
@ -3817,9 +3821,9 @@ msgid ""
"\t\tYou may also wish to add some basic information to your default profile\n"
"\t\t(on the \"Profiles\" page) so that other people can easily find you.\n"
"\n"
"\t\tWe recommend adding a profile photo, adding some profile \"keywords\" \n"
"\t\tWe recommend adding a profile photo, adding some profile \"keywords\"\n"
"\t\t(very useful in making new friends) - and perhaps what country you live "
"in; \n"
"in;\n"
"\t\tif you do not wish to be more specific than that.\n"
"\n"
"\t\tWe fully respect your right to privacy, and none of these items are "
@ -3833,12 +3837,12 @@ msgid ""
"\t\tThank you and welcome to %4$s."
msgstr ""
#: src/Model/User.php:1627 src/Model/User.php:1733
#: src/Model/User.php:1629 src/Model/User.php:1735
#, php-format
msgid "Registration details for %s"
msgstr ""
#: src/Model/User.php:1647
#: src/Model/User.php:1649
#, php-format
msgid ""
"\n"
@ -3854,12 +3858,12 @@ msgid ""
"\t\t"
msgstr ""
#: src/Model/User.php:1666
#: src/Model/User.php:1668
#, php-format
msgid "Registration at %s"
msgstr ""
#: src/Model/User.php:1690
#: src/Model/User.php:1692
#, php-format
msgid ""
"\n"
@ -3868,7 +3872,7 @@ msgid ""
"\t\t\t"
msgstr ""
#: src/Model/User.php:1698
#: src/Model/User.php:1700
#, php-format
msgid ""
"\n"
@ -3906,7 +3910,7 @@ msgid ""
"\t\t\tThank you and welcome to %2$s."
msgstr ""
#: src/Model/User.php:1760
#: src/Model/User.php:1762
msgid ""
"User with delegates can't be removed, please remove delegate users first"
msgstr ""

View File

@ -1,7 +1,7 @@
<div class="field checkbox" id="div_id_{{$field.0}}">
<label id="id_{{$field.0}}_label" for="id_{{$field.0}}">{{$field.1}}</label>
<input type="hidden" name="{{$field.0}}" value="0">
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" aria-describedby="{{$field.0}}_tip" value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.4}}{{$field.4}}{{/if}}>
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" aria-describedby="{{$field.0}}_tip" value="1" {{if $field.2}}checked{{/if}} {{$field.4 nofilter}}>
{{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -1,12 +1,12 @@
<div class='field combobox'>
<label for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
<div class="field combobox">
<label for="id_{{$field.0}}" id="id_{{$field.0}}_label">{{$field.1}}</label>
{{* html5 don't work on Chrome, Safari and IE9
<input id="id_{{$field.0}}" type="text" list="data_{{$field.0}}">
<datalist id="data_{{$field.0}}">
{{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{/foreach}}
</datalist> *}}
<input id="id_{{$field.0}}" type="text" value="{{$field.2}}" aria-describedby='{{$field.0}}_tip'>
<input id="id_{{$field.0}}" type="text" value="{{$field.2}}" aria-describedby="{{$field.0}}_tip">
<select id="select_{{$field.0}}" onChange="$('#id_{{$field.0}}').val($(this).val())">
<option value="">{{$field.5}}</option>
{{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}

View File

@ -1,7 +1,7 @@
<div class='field custom'>
<label for='{{$field.0}}'>{{$field.1}}</label>
<div class="field custom">
<label for="{{$field.0}}">{{$field.1}}</label>
{{$field.2 nofilter}}
{{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>

View File

@ -1,4 +1,4 @@
{{include file='field_input.tpl' field=$field}}
{{include file="field_input.tpl" field=$field}}
<script type="text/javascript">
$(function () {

View File

@ -1,7 +1,7 @@
<div class="field input" id="wrapper_{{$field.0}}">
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<input type="{{$field.6|default:'text'}}" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.4}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip" dir="auto">
<input type="{{$field.6|default:'text'}}" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.4}} required{{/if}} {{$field.5 nofilter}} aria-describedby="{{$field.0}}_tip" dir="auto">
{{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -1,9 +1,9 @@
<div class='field checkbox'>
<label for='id_{{$field.0}}'>{{$field.1}}</label>
<input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.3}}" {{if $field.2}}checked="true"{{/if}} aria-describedby='{{$field.0}}_tip'>
<div class="field checkbox">
<label for="id_{{$field.0}}">{{$field.1}}</label>
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.3}}" {{if $field.2}}checked{{/if}} aria-describedby="{{$field.0}}_tip">
{{if $field.4}}
<span class='field_help' role='tooltip' id='{{$field.0}}_tip'>{{$field.4 nofilter}}</span>
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.4 nofilter}}</span>
{{/if}}
</div>

View File

@ -1,6 +1,6 @@
<div class='field input openid' id='wrapper_{{$field.0}}'>
<label for='id_{{$field.0}}'>{{$field.1}}</label>
<input name='{{$field.0}}' id='id_{{$field.0}}' type="text" value="{{$field.2}}" {{if $field.4}} readonly="readonly" {{/if}} aria-describedby='{{$field.0}}_tip'>
<div class="field input openid" id="wrapper_{{$field.0}}">
<label for="id_{{$field.0}}">{{$field.1}}</label>
<input name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}" {{if $field.4}}readonly{{/if}} aria-describedby="{{$field.0}}_tip">
{{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -1,6 +1,6 @@
<div class="field password" id="wrapper_{{$field.0}}">
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<input type="password" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.4}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5}}{{/if}}{{if $field.6}} pattern="(($field.6}}"{{/if}} aria-describedby="{{$field.0}}_tip">
<input type="password" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}" {{if $field.4}}required{{/if}} {{$field.5 nofilter}} {{if $field.6}}pattern="(($field.6}}"{{/if}} aria-describedby="{{$field.0}}_tip">
{{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -1,7 +1,7 @@
<div class='field radio'>
<label for='id_{{$field.0}}_{{$field.2}}'>{{$field.1}}</label>
<input type="radio" name='{{$field.0}}' id='id_{{$field.0}}_{{$field.2}}' value="{{$field.2}}" {{if $field.4}}checked{{/if}} aria-describedby={{$field.0}}_{{$field.2}}_tip'>
<div class="field radio">
<label for="id_{{$field.0}}_{{$field.2}}">{{$field.1}}</label>
<input type="radio" name="{{$field.0}}" id="id_{{$field.0}}_{{$field.2}}" value="{{$field.2}}" {{if $field.4}}checked{{/if}} aria-describedby="{{$field.0}}_{{$field.2}}_tip">
{{if $field.3}}
<span class='field_help' role='tooltip' id='{{$field.0}}_{{$field.2}}_tip'>{{$field.3 nofilter}}</span>
<span class="field_help" role="tooltip" id="{{$field.0}}_{{$field.2}}_tip">{{$field.3 nofilter}}</span>
{{/if}}
</div>

View File

@ -3,10 +3,10 @@
<label for="id_{{$field.0}}">{{$field.1}}</label>
<select name="{{$field.0}}" id="id_{{$field.0}}" aria-describedby="{{$field.0}}_tip" {{$field.5 nofilter}}>
{{foreach $field.4 as $opt => $val}}
{{if $field.5 == 'multiple'}}
<option value="{{$opt}}" dir="auto"{{if in_array($opt, $field.2)}} selected="selected"{{/if}}>{{$val}}</option>
{{if $field.5 == "multiple"}}
<option value="{{$opt}}" dir="auto" {{if in_array($opt, $field.2)}}selected{{/if}}>{{$val}}</option>
{{else}}
<option value="{{$opt}}" dir="auto"{{if $opt == $field.2}} selected="selected"{{/if}}>{{$val}}</option>
<option value="{{$opt}}" dir="auto" {{if $opt == $field.2}}selected{{/if}}>{{$val}}</option>
{{/if}}
{{/foreach}}
</select>

View File

@ -1,7 +1,7 @@
<div class="field textarea">
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<textarea class="form-control text-autosize" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.4}} required{{/if}}{{if $field.5}} {{$field.5}}{{/if}} aria-describedby="{{$field.0}}_tip" dir="auto">{{$field.2}}</textarea>
<textarea class="form-control text-autosize" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.4}}required{{/if}} {{$field.5 nofilter}} aria-describedby="{{$field.0}}_tip" dir="auto">{{$field.2}}</textarea>
{{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -6,7 +6,7 @@
<label for="id_{{$field.0}}">{{$field.1}}</label>
<select name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.5}}onchange="previewTheme(this);"{{/if}} aria-describedby="{{$field.0}}_tip">
{{foreach $field.4 as $opt=>$val}}
<option value="{{$opt}}" dir="auto"{{if $opt==$field.2}} selected="selected"{{/if}}>{{$val}}</option>
<option value="{{$opt}}" dir="auto" {{if $opt==$field.2}}selected{{/if}}>{{$val}}</option>
{{/foreach}}
</select>
{{if $field.3}}

View File

@ -1,7 +1,7 @@
<div class="field checkbox" id="div_id_{{$field.0}}">
<input type="hidden" name="{{$field.0}}" value="0">
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.3}}aria-describedby="{{$field.0}}_tip"{{/if}} {{if $field.4}}{{$field.4}}{{/if}}>
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="1" {{if $field.2}}checked{{/if}} {{if $field.3}}aria-describedby="{{$field.0}}_tip"{{/if}} {{$field.4 nofilter}}>
<label for="id_{{$field.0}}">
{{$field.1}}
{{if $field.3}}

View File

@ -1,7 +1,7 @@
<div class="form-group field input file">
<label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<div class="input-group" id="{{$field.0}}">
<input class="form-control file" name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}"{{if $field.4}} required{{/if}} aria-describedby="{{$field.0}}_tip">
<input class="form-control file" name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}" {{if $field.4}}required{{/if}} aria-describedby="{{$field.0}}_tip">
<span class="input-group-addon image-select"><i class="fa fa-picture-o"></i></span>
</div>
{{if $field.3}}

View File

@ -3,7 +3,7 @@
{{if !isset($label) || $label != false }}
<label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1 nofilter}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
{{/if}}
<input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="{{$field.6|default:'text'}}" value="{{$field.2}}"{{if $field.4}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip">
<input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="{{$field.6|default:'text'}}" value="{{$field.2}}" {{if $field.4}}required{{/if}} {{$field.5 nofilter}} aria-describedby="{{$field.0}}_tip">
{{if $field.3}}
<span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -1,6 +1,6 @@
<div class="form-group field checkbox">
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.3}}" {{if $field.2}}checked="checked"{{/if}} aria-checked="{{if $field.2}}true{{else}}false{{/if}}" aria-describedby="{{$field.0}}_tip">
<input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.3}}" {{if $field.2}}checked{{/if}} aria-checked="{{if $field.2}}true{{else}}false{{/if}}" aria-describedby="{{$field.0}}_tip">
<label for="id_{{$field.0}}">{{$field.1}}</label>
{{if $field.4}}
<span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.4 nofilter}}</span>

View File

@ -1,6 +1,6 @@
<div id="id_{{$field.0}}_wrapper" class="form-group field input openid">
<label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1}}</label>
<input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}" {{if $field.4}} readonly="readonly" {{/if}} aria-describedby="{{$field.0}}_tip">
<input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}" {{if $field.4}}readonly{{/if}} aria-describedby="{{$field.0}}_tip">
{{if $field.3}}
<span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -1,6 +1,6 @@
<div id="id_{{$field.0}}_wrapper" class="form-group field input password">
<label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="password" value="{{$field.2}}" {{if $field.4}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5}}{{/if}}{{if $field.6}} pattern="{{$field.6}}"{{/if}} aria-describedby="{{$field.0}}_tip">
<input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="password" value="{{$field.2}}" {{if $field.4}}required{{/if}} {{$field.5 nofilter}} {{if $field.6}}pattern="{{$field.6}}"{{/if}} aria-describedby="{{$field.0}}_tip">
{{if $field.3}}
<span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -3,10 +3,10 @@
<label for="id_{{$field.0}}">{{$field.1}}</label>
<select name="{{$field.0}}" id="id_{{$field.0}}" class="form-control" aria-describedby="{{$field.0}}_tip" {{$field.5 nofilter}}>
{{foreach $field.4 as $opt => $val}}
{{if $field.5 == 'multiple'}}
<option value="{{$opt}}" {{if in_array($opt, $field.2)}}selected="selected"{{/if}}>{{$val}}</option>
{{if $field.5 == "multiple"}}
<option value="{{$opt}}" {{if in_array($opt, $field.2)}}selected{{/if}}>{{$val}}</option>
{{else}}
<option value="{{$opt}}" {{if $opt == $field.2}}selected="selected"{{/if}}>{{$val}}</option>
<option value="{{$opt}}" {{if $opt == $field.2}}selected{{/if}}>{{$val}}</option>
{{/if}}
{{/foreach}}
</select>

View File

@ -2,7 +2,7 @@
{{if $field.1}}
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
{{/if}}
<textarea class="form-control text-autosize" name="{{$field.0}}" id="id_{{$field.0}}"{{if $field.4}} required{{/if}}{{if $field.5}} {{$field.5}}{{/if}} aria-describedby="{{$field.0}}_tip">{{$field.2}}</textarea>
<textarea class="form-control text-autosize" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.4}}required{{/if}} {{$field.5 nofilter}} aria-describedby="{{$field.0}}_tip">{{$field.2}}</textarea>
{{if $field.3}}
<span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.3 nofilter}}</span>
{{/if}}

View File

@ -6,7 +6,7 @@
<label for="id_{{$field.0}}">{{$field.1}}</label>
<select class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.5=="preview"}}onchange="previewTheme(this);"{{/if}} aria-describedby="{{$field.0}}_tip">
{{foreach $field.4 as $opt=>$val}}
<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>
<option value="{{$opt}}" {{if $opt==$field.2}}selected{{/if}}>{{$val}}</option>
{{/foreach}}
</select>
{{if $field.3}}