Upgrade to 4.5.0

This commit is contained in:
Bastian Allgeier
2024-11-28 11:24:28 +01:00
parent 49287c7a5e
commit 63ddf40692
86 changed files with 942 additions and 491 deletions
+130 -2
View File
@@ -1,7 +1,9 @@
## ##
## Bundle of CA Root Certificates ## Bundle of CA Root Certificates
## ##
## Certificate data from Mozilla as of: Tue Jul 2 03:12:04 2024 GMT ## Certificate data from Mozilla as of: Tue Nov 26 13:58:25 2024 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
## ##
## This is a bundle of X.509 certificates of public Certificate Authorities ## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +16,7 @@
## Just configure this file as the SSLCACertificateFile. ## Just configure this file as the SSLCACertificateFile.
## ##
## Conversion done with mk-ca-bundle.pl version 1.29. ## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 456ff095dde6dd73354c5c28c73d9c06f53b61a803963414cb91a1d92945cdd3 ## SHA256: 36105b01631f9fc03b1eca779b44a30a1a5890b9bf8dc07ccb001a07301e01cf
## ##
@@ -2600,6 +2602,36 @@ vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
CAezNIm8BZ/3Hobui3A= CAezNIm8BZ/3Hobui3A=
-----END CERTIFICATE----- -----END CERTIFICATE-----
GLOBALTRUST 2020
================
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
-----END CERTIFICATE-----
ANF Secure Server Root CA ANF Secure Server Root CA
========================= =========================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@@ -3566,3 +3598,99 @@ Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA= pYXFuXqUPoeovQA=
-----END CERTIFICATE----- -----END CERTIFICATE-----
TWCA CYBER Root CA
==================
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
-----END CERTIFICATE-----
SecureSign Root CA12
====================
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
-----END CERTIFICATE-----
SecureSign Root CA14
====================
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
-----END CERTIFICATE-----
SecureSign Root CA15
====================
-----BEGIN CERTIFICATE-----
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
-----END CERTIFICATE-----
+8 -8
View File
@@ -3,7 +3,7 @@
"description": "The Kirby core", "description": "The Kirby core",
"license": "proprietary", "license": "proprietary",
"type": "kirby-cms", "type": "kirby-cms",
"version": "4.4.1", "version": "4.5.0",
"keywords": [ "keywords": [
"kirby", "kirby",
"cms", "cms",
@@ -38,15 +38,15 @@
"ext-openssl": "*", "ext-openssl": "*",
"christian-riesen/base32": "1.6.0", "christian-riesen/base32": "1.6.0",
"claviska/simpleimage": "4.2.0", "claviska/simpleimage": "4.2.0",
"composer/semver": "3.4.2", "composer/semver": "3.4.3",
"filp/whoops": "2.15.4", "filp/whoops": "2.16.0",
"getkirby/composer-installer": "^1.2.1", "getkirby/composer-installer": "^1.2.1",
"laminas/laminas-escaper": "2.13.0", "laminas/laminas-escaper": "2.14.0",
"michelf/php-smartypants": "1.8.1", "michelf/php-smartypants": "1.8.1",
"phpmailer/phpmailer": "6.9.1", "phpmailer/phpmailer": "6.9.2",
"symfony/polyfill-intl-idn": "1.30.0", "symfony/polyfill-intl-idn": "1.31.0",
"symfony/polyfill-mbstring": "1.30.0", "symfony/polyfill-mbstring": "1.31.0",
"symfony/yaml": "6.4.11" "symfony/yaml": "6.4.13"
}, },
"replace": { "replace": {
"symfony/polyfill-php72": "*" "symfony/polyfill-php72": "*"
+57 -58
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "e180b005ee9eb7164de462164b71a337", "content-hash": "f12b026f0a6ca67dc1bd0072f607d1eb",
"packages": [ "packages": [
{ {
"name": "christian-riesen/base32", "name": "christian-riesen/base32",
@@ -120,24 +120,24 @@
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
"version": "3.4.2", "version": "3.4.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/semver.git", "url": "https://github.com/composer/semver.git",
"reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^5.3.2 || ^7.0 || ^8.0" "php": "^5.3.2 || ^7.0 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.4", "phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^4.2 || ^5" "symfony/phpunit-bridge": "^3 || ^7"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -181,7 +181,7 @@
"support": { "support": {
"irc": "ircs://irc.libera.chat:6697/composer", "irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues", "issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.2" "source": "https://github.com/composer/semver/tree/3.4.3"
}, },
"funding": [ "funding": [
{ {
@@ -197,30 +197,30 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-07-12T11:35:52+00:00" "time": "2024-09-19T14:15:21+00:00"
}, },
{ {
"name": "filp/whoops", "name": "filp/whoops",
"version": "2.15.4", "version": "2.16.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/filp/whoops.git", "url": "https://github.com/filp/whoops.git",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" "reference": "befcdc0e5dce67252aa6322d82424be928214fa2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", "reference": "befcdc0e5dce67252aa6322d82424be928214fa2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^5.5.9 || ^7.0 || ^8.0", "php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0" "psr/log": "^1.0.1 || ^2.0 || ^3.0"
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "^0.9 || ^1.0", "mockery/mockery": "^1.0",
"phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
"symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" "symfony/var-dumper": "^4.0 || ^5.0"
}, },
"suggest": { "suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available", "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -260,7 +260,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/filp/whoops/issues", "issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.15.4" "source": "https://github.com/filp/whoops/tree/2.16.0"
}, },
"funding": [ "funding": [
{ {
@@ -268,7 +268,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-03T12:00:00+00:00" "time": "2024-09-25T12:00:00+00:00"
}, },
{ {
"name": "getkirby/composer-installer", "name": "getkirby/composer-installer",
@@ -319,33 +319,33 @@
}, },
{ {
"name": "laminas/laminas-escaper", "name": "laminas/laminas-escaper",
"version": "2.13.0", "version": "2.14.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laminas/laminas-escaper.git", "url": "https://github.com/laminas/laminas-escaper.git",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/0f7cb975f4443cf22f33408925c231225cfba8cb",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "~8.1.0 || ~8.2.0 || ~8.3.0" "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"conflict": { "conflict": {
"zendframework/zend-escaper": "*" "zendframework/zend-escaper": "*"
}, },
"require-dev": { "require-dev": {
"infection/infection": "^0.27.0", "infection/infection": "^0.27.9",
"laminas/laminas-coding-standard": "~2.5.0", "laminas/laminas-coding-standard": "~3.0.0",
"maglnet/composer-require-checker": "^3.8.0", "maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.6.7", "phpunit/phpunit": "^9.6.16",
"psalm/plugin-phpunit": "^0.18.4", "psalm/plugin-phpunit": "^0.19.0",
"vimeo/psalm": "^5.9" "vimeo/psalm": "^5.21.1"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -377,7 +377,7 @@
"type": "community_bridge" "type": "community_bridge"
} }
], ],
"time": "2023-10-10T08:35:13+00:00" "time": "2024-10-24T10:12:53+00:00"
}, },
{ {
"name": "league/color-extractor", "name": "league/color-extractor",
@@ -496,16 +496,16 @@
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v6.9.1", "version": "v6.9.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18" "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a7b17b42fa4887c92146243f3d2f4ccb962af17c",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18", "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -565,7 +565,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": { "support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues", "issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.2"
}, },
"funding": [ "funding": [
{ {
@@ -573,7 +573,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-25T22:23:28+00:00" "time": "2024-10-09T10:07:50+00:00"
}, },
{ {
"name": "psr/log", "name": "psr/log",
@@ -773,22 +773,21 @@
}, },
{ {
"name": "symfony/polyfill-intl-idn", "name": "symfony/polyfill-intl-idn",
"version": "v1.30.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git", "url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1", "php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-intl-normalizer": "^1.10"
"symfony/polyfill-php72": "^1.10"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
@@ -837,7 +836,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@@ -853,7 +852,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T15:07:36+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
@@ -938,20 +937,20 @@
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.30.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-mbstring": "*" "ext-mbstring": "*"
@@ -998,7 +997,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@@ -1014,20 +1013,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-06-19T12:30:46+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v6.4.11", "version": "v6.4.13",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "be37e7f13195e05ab84ca5269365591edd240335" "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335", "url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9",
"reference": "be37e7f13195e05ab84ca5269365591edd240335", "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1070,7 +1069,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v6.4.11" "source": "https://github.com/symfony/yaml/tree/v6.4.13"
}, },
"funding": [ "funding": [
{ {
@@ -1086,7 +1085,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-12T09:55:28+00:00" "time": "2024-09-25T14:18:03+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],
+12
View File
@@ -31,6 +31,18 @@ return [
]; ];
} }
], ],
[
'pattern' => 'system/method-test',
'method' => 'PATCH',
'action' => function () {
return [
'status' => match ($this->kirby()->request()->method()) {
'PATCH' => 'ok',
default => 'fail'
}
];
}
],
[ [
'pattern' => 'system/register', 'pattern' => 'system/register',
'method' => 'POST', 'method' => 'POST',
+3 -1
View File
@@ -203,7 +203,9 @@ return [
'users/(:any)/roles', 'users/(:any)/roles',
], ],
'action' => function (string $id) { 'action' => function (string $id) {
return $this->user($id)->roles(); $kirby = $this->kirby();
$purpose = $kirby->request()->get('purpose');
return $this->user($id)->roles($purpose);
} }
], ],
[ [
+1 -1
View File
@@ -256,7 +256,7 @@ return [
}, },
'submit' => function (string $languageCode, string $translationKey) { 'submit' => function (string $languageCode, string $translationKey) {
Find::language($languageCode)->variable($translationKey, true)->update( Find::language($languageCode)->variable($translationKey, true)->update(
App::instance()->request()->get('value') App::instance()->request()->get('value', '')
); );
return true; return true;
+2 -1
View File
@@ -3,6 +3,7 @@
use Kirby\Cms\App; use Kirby\Cms\App;
use Kirby\Cms\Find; use Kirby\Cms\Find;
use Kirby\Cms\PageRules; use Kirby\Cms\PageRules;
use Kirby\Cms\Url;
use Kirby\Exception\Exception; use Kirby\Exception\Exception;
use Kirby\Exception\InvalidArgumentException; use Kirby\Exception\InvalidArgumentException;
use Kirby\Exception\PermissionException; use Kirby\Exception\PermissionException;
@@ -431,7 +432,7 @@ return [
]; ];
} }
$slugAppendix = Str::slug(I18n::translate('page.duplicate.appendix')); $slugAppendix = Url::slug(I18n::translate('page.duplicate.appendix'));
$titleAppendix = I18n::translate('page.duplicate.appendix'); $titleAppendix = I18n::translate('page.duplicate.appendix');
// if the item to be duplicated already exists // if the item to be duplicated already exists
+17 -9
View File
@@ -20,12 +20,19 @@ return [
'pattern' => 'users/create', 'pattern' => 'users/create',
'load' => function () { 'load' => function () {
$kirby = App::instance(); $kirby = App::instance();
$roles = $kirby->roles()->canBeCreated();
// get default value for role // get default value for role
if ($role = $kirby->request()->get('role')) { if ($role = $kirby->request()->get('role')) {
$role = $kirby->roles()->find($role)?->id(); $role = $roles->find($role)?->id();
} }
// get role field definition, incl. available role options
$roles = Field::role(
roles: $roles,
props: ['required' => true]
);
return [ return [
'component' => 'k-form-dialog', 'component' => 'k-form-dialog',
'props' => [ 'props' => [
@@ -39,9 +46,7 @@ return [
'translation' => Field::translation([ 'translation' => Field::translation([
'required' => true 'required' => true
]), ]),
'role' => Field::role([ 'role' => $roles
'required' => true
])
], ],
'submitButton' => I18n::translate('create'), 'submitButton' => I18n::translate('create'),
'value' => [ 'value' => [
@@ -49,7 +54,7 @@ return [
'email' => '', 'email' => '',
'password' => '', 'password' => '',
'translation' => $kirby->panelLanguage(), 'translation' => $kirby->panelLanguage(),
'role' => $role ?? $kirby->user()->role()->name() 'role' => $role ?? $roles['options'][0]['value'] ?? null
] ]
] ]
]; ];
@@ -228,10 +233,13 @@ return [
'component' => 'k-form-dialog', 'component' => 'k-form-dialog',
'props' => [ 'props' => [
'fields' => [ 'fields' => [
'role' => Field::role([ 'role' => Field::role(
'label' => I18n::translate('user.changeRole.select'), roles: $user->roles(),
'required' => true, props: [
]) 'label' => I18n::translate('user.changeRole.select'),
'required' => true,
]
)
], ],
'submitButton' => I18n::translate('user.changeRole'), 'submitButton' => I18n::translate('user.changeRole'),
'value' => [ 'value' => [
+2 -1
View File
@@ -18,7 +18,8 @@ return [
return [ return [
'component' => 'k-users-view', 'component' => 'k-users-view',
'props' => [ 'props' => [
'role' => function () use ($kirby, $roles, $role) { 'canCreate' => $kirby->roles()->canBeCreated()->count() > 0,
'role' => function () use ($roles, $role) {
if ($role) { if ($role) {
return $roles[$role] ?? null; return $roles[$role] ?? null;
} }
+7 -6
View File
@@ -10,12 +10,13 @@ if (
) { ) {
$url = $video->url(); $url = $video->url();
$attrs = array_filter([ $attrs = array_filter([
'autoplay' => $block->autoplay()->toBool(), 'autoplay' => $block->autoplay()->toBool(),
'controls' => $block->controls()->toBool(), 'controls' => $block->controls()->toBool(),
'loop' => $block->loop()->toBool(), 'loop' => $block->loop()->toBool(),
'muted' => $block->muted()->toBool(), 'muted' => $block->muted()->toBool() || $block->autoplay()->toBool(),
'poster' => $block->poster()->toFile()?->url(), 'playsinline' => $block->autoplay()->toBool(),
'preload' => $block->preload()->value(), 'poster' => $block->poster()->toFile()?->url(),
'preload' => $block->preload()->value(),
]); ]);
} else { } else {
$url = $block->url(); $url = $block->url();
+5 -5
View File
@@ -126,12 +126,12 @@
"error.form.notSaved": "Formulář nemohl být uložen", "error.form.notSaved": "Formulář nemohl být uložen",
"error.language.code": "Zadejte prosím platný kód jazyka", "error.language.code": "Zadejte prosím platný kód jazyka",
"error.language.create.permission": "You are not allowed to create a language", "error.language.create.permission": "Nemáte dovoleno vytvořit jazyk",
"error.language.delete.permission": "You are not allowed to delete the language", "error.language.delete.permission": "Nemáte dovoleno jazyk vymazat",
"error.language.duplicate": "Jazyk již existuje", "error.language.duplicate": "Jazyk již existuje",
"error.language.name": "Zadejte prosím platné jméno jazyka", "error.language.name": "Zadejte prosím platné jméno jazyka",
"error.language.notFound": "Jazyk nebyl nalezen", "error.language.notFound": "Jazyk nebyl nalezen",
"error.language.update.permission": "You are not allowed to update the language", "error.language.update.permission": "Nemáte dovoleno aktualizovat jazyk",
"error.layout.validation.block": "V rozvržení {layoutIndex} je v poli \"{field}\" v bloku {blockIndex} při použití \"{fieldset}\" typu chyba", "error.layout.validation.block": "V rozvržení {layoutIndex} je v poli \"{field}\" v bloku {blockIndex} při použití \"{fieldset}\" typu chyba",
"error.layout.validation.settings": "Chyba v nastavení rozvržení {index}", "error.layout.validation.settings": "Chyba v nastavení rozvržení {index}",
@@ -620,8 +620,8 @@
"stats.empty": "Žádná hlášení", "stats.empty": "Žádná hlášení",
"status": "Stav", "status": "Stav",
"system.info.copy": "Copy info", "system.info.copy": "Kopírovat informace",
"system.info.copied": "System info copied", "system.info.copied": "Systémové informace zkopírovány",
"system.issues.content": "Složka content je zřejmě přístupná zvenčí", "system.issues.content": "Složka content je zřejmě přístupná zvenčí",
"system.issues.eol.kirby": "Instalovaná verze Kirby dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace", "system.issues.eol.kirby": "Instalovaná verze Kirby dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace",
"system.issues.eol.plugin": "Instalovaná verze doplňku { plugin } dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace", "system.issues.eol.plugin": "Instalovaná verze doplňku { plugin } dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace",
+2
View File
@@ -168,6 +168,7 @@
"error.page.move.ancestor": "The page cannot be moved into itself", "error.page.move.ancestor": "The page cannot be moved into itself",
"error.page.move.directory": "The page directory cannot be moved", "error.page.move.directory": "The page directory cannot be moved",
"error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists", "error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists",
"error.page.move.noSections": "The page \"{parent}\" cannot be a parent of any page because it lacks any pages sections in its blueprint",
"error.page.move.notFound": "The moved page could not be found", "error.page.move.notFound": "The moved page could not be found",
"error.page.move.permission": "You are not allowed to move \"{slug}\"", "error.page.move.permission": "You are not allowed to move \"{slug}\"",
"error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"", "error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"",
@@ -629,6 +630,7 @@
"system.info.copy": "Copy info", "system.info.copy": "Copy info",
"system.info.copied": "System info copied", "system.info.copied": "System info copied",
"system.issues.api.methods": "Your server does not support PATCH requests",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",
+3 -3
View File
@@ -126,12 +126,12 @@
"error.form.notSaved": "Het formulier kon niet worden opgeslagen", "error.form.notSaved": "Het formulier kon niet worden opgeslagen",
"error.language.code": "Vul een geldige code voor deze taal in", "error.language.code": "Vul een geldige code voor deze taal in",
"error.language.create.permission": "You are not allowed to create a language", "error.language.create.permission": "Je hebt geen rechten om een taal toe te voegen",
"error.language.delete.permission": "You are not allowed to delete the language", "error.language.delete.permission": "Je hebt geen rechten om een taal te verwijderen",
"error.language.duplicate": "De taal bestaat al", "error.language.duplicate": "De taal bestaat al",
"error.language.name": "Vul een geldige naam voor deze taal in", "error.language.name": "Vul een geldige naam voor deze taal in",
"error.language.notFound": "De taal kan niet worden gevonden", "error.language.notFound": "De taal kan niet worden gevonden",
"error.language.update.permission": "You are not allowed to update the language", "error.language.update.permission": "Je hebt geen rechten om deze taal te updaten",
"error.layout.validation.block": "Er is een fout opgetreden bij het \"{field}\" veld in blok {blockIndex} in het \"{fieldset}\" bloktype in layout {layoutIndex}", "error.layout.validation.block": "Er is een fout opgetreden bij het \"{field}\" veld in blok {blockIndex} in het \"{fieldset}\" bloktype in layout {layoutIndex}",
"error.layout.validation.settings": "Er is een fout gevonden in de instellingen van ontwerp {index} ", "error.layout.validation.settings": "Er is een fout gevonden in de instellingen van ontwerp {index} ",
+6 -6
View File
@@ -104,16 +104,16 @@
"error.file.extension.forbidden": "A extensão \"{extension}\" não é permitida", "error.file.extension.forbidden": "A extensão \"{extension}\" não é permitida",
"error.file.extension.invalid": "Extensão inválida: {extension}", "error.file.extension.invalid": "Extensão inválida: {extension}",
"error.file.extension.missing": "As extensões de \"{filename}\" estão em falta", "error.file.extension.missing": "As extensões de \"{filename}\" estão em falta",
"error.file.maxheight": "A altura da imagem não deve exceder {height} pixels", "error.file.maxheight": "A altura da imagem não deve exceder {height} píxeis",
"error.file.maxsize": "O ficheiro é demasiado grande", "error.file.maxsize": "O ficheiro é demasiado grande",
"error.file.maxwidth": "A largura da imagem não deve exceder {width} pixels", "error.file.maxwidth": "A largura da imagem não deve exceder {width} píxeis",
"error.file.mime.differs": "O ficheiro enviado precisa de ser do tipo \"{mime}\"", "error.file.mime.differs": "O ficheiro enviado precisa de ser do tipo \"{mime}\"",
"error.file.mime.forbidden": "O tipo de mídia \"{mime}\" não é permitido", "error.file.mime.forbidden": "O tipo de mídia \"{mime}\" não é permitido",
"error.file.mime.invalid": "Tipo de mídia inválido: {mime}", "error.file.mime.invalid": "Tipo de mídia inválido: {mime}",
"error.file.mime.missing": "Não foi possível detectar o tipo de mídia de \"{filename}\"", "error.file.mime.missing": "Não foi possível detectar o tipo de mídia de \"{filename}\"",
"error.file.minheight": "A altura da imagem deve ter pelo menos {height} pixels", "error.file.minheight": "A altura da imagem deve ter pelo menos {height} píxeis",
"error.file.minsize": "O ficheiro é demasiado pequeno", "error.file.minsize": "O ficheiro é demasiado pequeno",
"error.file.minwidth": "A largura da imagem deve ter pelo menos {width} pixels", "error.file.minwidth": "A largura da imagem deve ter pelo menos {width} píxeis",
"error.file.name.unique": "O nome do ficheiro deve ser único", "error.file.name.unique": "O nome do ficheiro deve ser único",
"error.file.name.missing": "O nome do ficheiro não pode ficar em branco", "error.file.name.missing": "O nome do ficheiro não pode ficar em branco",
"error.file.notFound": "Não foi possível encontrar o ficheiro \"{filename}\"", "error.file.notFound": "Não foi possível encontrar o ficheiro \"{filename}\"",
@@ -490,7 +490,7 @@
"login.totp.disable.option": "Desativar códigos de segurança", "login.totp.disable.option": "Desativar códigos de segurança",
"login.totp.disable.label": "Insira a sua palavra-passe para desativar códigos de segurança", "login.totp.disable.label": "Insira a sua palavra-passe para desativar códigos de segurança",
"login.totp.disable.help": "No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando iniciar a sessão. Poderá configurar códigos de segurança novamente mais tarde.", "login.totp.disable.help": "No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando iniciar a sessão. Poderá configurar códigos de segurança novamente mais tarde.",
"login.totp.disable.admin": "<p>Isto irá desactivar os códigos de segurança para <strong>{user}</strong>.</p> <p>No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando eles iniciarem a sessão. {user} poderá configurar códigos de segurança novamente após o próximo início de sessão.</p>", "login.totp.disable.admin": "<p>Isto irá desativar os códigos de segurança para <strong>{user}</strong>.</p> <p>No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando eles iniciarem a sessão. {user} poderá configurar códigos de segurança novamente após o próximo início de sessão.</p>",
"login.totp.disable.success": "Códigos de segurança desativados", "login.totp.disable.success": "Códigos de segurança desativados",
"logout": "Sair", "logout": "Sair",
@@ -573,7 +573,7 @@
"paste": "Colar", "paste": "Colar",
"paste.after": "Colar após", "paste.after": "Colar após",
"paste.success": "{count} colados!", "paste.success": "{count} colados!",
"pixel": "Pixel", "pixel": "Píxel",
"plugin": "Plugin", "plugin": "Plugin",
"plugins": "Plugins", "plugins": "Plugins",
"prev": "Anterior", "prev": "Anterior",
+5 -5
View File
@@ -126,12 +126,12 @@
"error.form.notSaved": "Formuläret kunde inte sparas", "error.form.notSaved": "Formuläret kunde inte sparas",
"error.language.code": "Ange en giltig kod för språket", "error.language.code": "Ange en giltig kod för språket",
"error.language.create.permission": "You are not allowed to create a language", "error.language.create.permission": "Du saknar behörighet att skapa ett nytt språk",
"error.language.delete.permission": "You are not allowed to delete the language", "error.language.delete.permission": "Du saknar behörighet att radera språket",
"error.language.duplicate": "Språket finns redan", "error.language.duplicate": "Språket finns redan",
"error.language.name": "Ange ett giltigt namn för språket", "error.language.name": "Ange ett giltigt namn för språket",
"error.language.notFound": "Språket hittades inte", "error.language.notFound": "Språket hittades inte",
"error.language.update.permission": "You are not allowed to update the language", "error.language.update.permission": "Du saknar behörighet att redigera språket",
"error.layout.validation.block": "Det finns ett fel i fältet \"{field}\" i blocket {blockIndex} med blocktypen \"{fieldset}\" i layouten {layoutIndex}", "error.layout.validation.block": "Det finns ett fel i fältet \"{field}\" i blocket {blockIndex} med blocktypen \"{fieldset}\" i layouten {layoutIndex}",
"error.layout.validation.settings": "Det finns ett fel i inställningarna för layout {index}", "error.layout.validation.settings": "Det finns ett fel i inställningarna för layout {index}",
@@ -620,8 +620,8 @@
"stats.empty": "Inga rapporter", "stats.empty": "Inga rapporter",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info", "system.info.copy": "Kopiera info",
"system.info.copied": "System info copied", "system.info.copied": "Systeminformation kopierad",
"system.issues.content": "Mappen content verkar vara exponerad", "system.issues.content": "Mappen content verkar vara exponerad",
"system.issues.eol.kirby": "Din installerade Kirby-version har nått slutet av sin livscykel och kommer inte att få fler säkerhetsuppdateringar", "system.issues.eol.kirby": "Din installerade Kirby-version har nått slutet av sin livscykel och kommer inte att få fler säkerhetsuppdateringar",
"system.issues.eol.plugin": "Den installerade versionen av tillägget { plugin } har nått slutet på sin livscykel och kommer inte att få fler säkerhetsuppdateringar.", "system.issues.eol.plugin": "Den installerade versionen av tillägget { plugin } har nått slutet på sin livscykel och kommer inte att få fler säkerhetsuppdateringar.",
+1 -1
View File
File diff suppressed because one or more lines are too long
+3
View File
@@ -20,6 +20,9 @@
</symbol> </symbol>
<symbol id="icon-angle-down" viewBox="0 0 24 24"> <symbol id="icon-angle-down" viewBox="0 0 24 24">
<path d="M11.9997 13.1714L16.9495 8.22168L18.3637 9.63589L11.9997 15.9999L5.63574 9.63589L7.04996 8.22168L11.9997 13.1714Z" /> <path d="M11.9997 13.1714L16.9495 8.22168L18.3637 9.63589L11.9997 15.9999L5.63574 9.63589L7.04996 8.22168L11.9997 13.1714Z" />
</symbol>
<symbol id="icon-angle-dropdown" viewBox="0 0 24 24">
<path d="M12 15.0006L7.75732 10.758L9.17154 9.34375L12 12.1722L14.8284 9.34375L16.2426 10.758L12 15.0006Z" />
</symbol> </symbol>
<symbol id="icon-angle-left" viewBox="0 0 24 24"> <symbol id="icon-angle-left" viewBox="0 0 24 24">
<path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" /> <path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" />

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
import{D as t}from"./Docs.min.js";import{n as s}from"./index.min.js";import"./vendor.min.js";const o=s({components:{"k-lab-docs":t},props:{component:String,docs:Object,lab:String},mounted(){},methods:{reloadDocs(){this.$panel.view.refresh()}}},(function(){var t=this,s=t._self._c;return s("k-panel-inside",{staticClass:"k-lab-docs-view"},[s("k-header",[t._v(" "+t._s(t.component)+" "),t.docs.github||t.lab?s("k-button-group",{attrs:{slot:"buttons"},slot:"buttons"},[t.lab?s("k-button",{attrs:{icon:"lab",text:"Lab examples",size:"sm",variant:"filled",link:"/lab/"+t.lab}}):t._e(),t.docs.github?s("k-button",{attrs:{icon:"github",size:"sm",variant:"filled",link:t.docs.github,target:"_blank"}}):t._e()],1):t._e()],1),s("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;export{o as default}; import{D as t}from"./Docs.min.js";import{n as s}from"./index.min.js";import"./vendor.min.js";const o=s({components:{"k-lab-docs":t},props:{component:String,docs:Object,lab:String},mounted(){},methods:{reloadDocs(){this.$panel.view.refresh()}}},(function(){var t=this,s=t._self._c;return s("k-panel-inside",{staticClass:"k-lab-docs-view"},[s("k-header",[t._v(" "+t._s(t.component)+" "),t.docs.github||t.lab?s("k-button-group",{attrs:{slot:"buttons"},slot:"buttons"},[t.lab?s("k-button",{attrs:{icon:"lab",text:"Lab examples",size:"sm",variant:"filled",link:"/lab/"+t.lab}}):t._e(),t.docs.github?s("k-button",{attrs:{icon:"github",size:"sm",variant:"filled",link:t.docs.github,target:"_blank"}}):t._e()],1):t._e()],1),s("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[]).exports;export{o as default};
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
import{n as e}from"./index.min.js";import"./vendor.min.js";const t=e({props:{categories:Array,info:String,tab:String}},(function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-lab-index-view"},[t("k-header",[e._v("Lab")]),t("k-tabs",{attrs:{tab:e.tab,tabs:[{name:"examples",label:"Examples",link:"/lab"},{name:"docs",label:"Docs",link:"/lab/docs"}]}}),e.info?t("k-box",{attrs:{icon:"question",theme:"info",text:e.info,html:!0}}):e._e(),e._l(e.categories,(function(e){return t("k-section",{key:e.name,attrs:{headline:e.name}},[t("k-collection",{attrs:{items:e.examples,empty:{icon:e.icon,text:"Add examples to "+e.path}}})],1)}))],2)}),[],!1,null,null,null,null).exports;export{t as default}; import{n as e}from"./index.min.js";import"./vendor.min.js";const t=e({props:{categories:Array,info:String,tab:String}},(function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-lab-index-view"},[t("k-header",[e._v("Lab")]),t("k-tabs",{attrs:{tab:e.tab,tabs:[{name:"examples",label:"Examples",link:"/lab"},{name:"docs",label:"Docs",link:"/lab/docs"}]}}),e.info?t("k-box",{attrs:{icon:"question",theme:"info",text:e.info,html:!0}}):e._e(),e._l(e.categories,(function(e){return t("k-section",{key:e.name,attrs:{headline:e.name}},[t("k-collection",{attrs:{items:e.examples,empty:{icon:e.icon,text:"Add examples to "+e.path}}})],1)}))],2)}),[]).exports;export{t as default};
+1 -1
View File
@@ -1 +1 @@
import{D as t}from"./Docs.min.js";import{n as e}from"./index.min.js";import"./vendor.min.js";const n=e({props:{docs:Object},emits:["cancel"],computed:{options(){const t=[{icon:"expand",link:"lab/docs/"+this.docs.component}];return this.docs.github&&t.unshift({icon:"github",link:this.docs.github,target:"_blank"}),t}}},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-form-drawer",attrs:{options:t.options},on:{submit:function(e){return t.$emit("cancel")}}},"k-drawer",t.$attrs,!1),[e("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;const l=e({props:{code:{type:Boolean,default:!0},label:String,flex:Boolean},data:()=>({mode:"preview"}),computed:{component(){return window.UiExamples[this.label]}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-lab-example",attrs:{"data-flex":t.flex,tabindex:"0"}},[e("header",{staticClass:"k-lab-example-header"},[e("h3",{staticClass:"k-lab-example-label"},[t._v(t._s(t.label))]),t.code?e("k-button-group",{staticClass:"k-lab-example-inspector",attrs:{layout:"collapsed"}},[e("k-button",{attrs:{theme:"preview"===t.mode?"info":null,icon:"preview",size:"xs",title:"Preview"},on:{click:function(e){t.mode="preview"}}}),e("k-button",{attrs:{theme:"inspect"===t.mode?"info":null,icon:"code",size:"xs",title:"Vue code"},on:{click:function(e){t.mode="inspect"}}})],1):t._e()],1),"preview"===t.mode?e("div",{staticClass:"k-lab-example-canvas"},[t._t("default")],2):t._e(),"inspect"===t.mode?e("div",{staticClass:"k-lab-example-code"},[e("k-code",{attrs:{language:"html"}},[t._v(t._s(t.component))])],1):t._e()])}),[],!1,null,null,null,null).exports;const a=e({},(function(){return(0,this._self._c)("div",{staticClass:"k-lab-examples"},[this._t("default")],2)}),[],!1,null,null,null,null).exports;const o=e({methods:{submit(t){const e=Object.fromEntries(new FormData(t));this.$panel.dialog.open({component:"k-lab-output-dialog",props:{code:JSON.stringify(e,null,2)}})}}},(function(){var t=this,e=t._self._c;return e("form",{staticClass:"k-lab-form",on:{submit:function(e){return e.preventDefault(),t.submit(e.target)}}},[t._t("default"),e("footer",[e("k-button",{attrs:{type:"submit",icon:"check",theme:"positive",variant:"filled"}},[t._v(" Submit ")])],1)],2)}),[],!1,null,null,null,null).exports;const s=e({props:{code:String,language:{default:"js",type:String}},emits:["cancel"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({attrs:{size:"large","cancel-button":!1,"submit-button":!1},on:{cancel:function(e){return t.$emit("cancel")}}},"k-dialog",t.$attrs,!1),[e("k-code",{attrs:{language:t.language}},[t._v(t._s(t.code))])],1)}),[],!1,null,null,null,null).exports;const i=e({},(function(){var t=this._self._c;return t("div",{staticClass:"k-table"},[t("table",[t("tbody",[t("tr",[t("td",{staticClass:"k-table-cell",attrs:{"data-mobile":"true"}},[this._t("default")],2)])])])])}),[],!1,null,null,null,null).exports;Vue.component("k-lab-docs",t),Vue.component("k-lab-docs-drawer",n),Vue.component("k-lab-example",l),Vue.component("k-lab-examples",a),Vue.component("k-lab-form",o),Vue.component("k-lab-output-dialog",s),Vue.component("k-lab-table-cell",i);const r=e({props:{docs:String,examples:[Object,Array],file:String,github:String,props:[Object,Array],styles:String,tab:String,tabs:{type:Array,default:()=>[]},template:String,title:String},data:()=>({component:null}),watch:{tab:{handler(){this.createComponent()},immediate:!0}},mounted(){this.$panel.view.path.replace(/lab\//,"")},methods:{async createComponent(){if(!this.file)return;const{default:t}=await import(this.$panel.url(this.file)+"?cache="+Date.now());t.template=this.template,this.component={...t},window.UiExamples=this.examples},openDocs(){this.$panel.drawer.open(`lab/docs/${this.docs}`)},async reloadComponent(){await this.$panel.view.refresh(),this.createComponent()},reloadDocs(){this.$panel.drawer.isOpen&&this.$panel.drawer.refresh()}}},(function(){var t=this,e=t._self._c;return e("k-panel-inside",{staticClass:"k-lab-playground-view",attrs:{"data-has-tabs":t.tabs.length>1}},[e("k-header",{scopedSlots:t._u([{key:"buttons",fn:function(){return[t.docs||t.github?e("k-button-group",[t.docs?e("k-button",{attrs:{text:t.docs,icon:"book",size:"sm",variant:"filled"},on:{click:t.openDocs}}):t._e(),t.github?e("k-button",{attrs:{link:t.github,icon:"github",size:"sm",target:"_blank",variant:"filled"}}):t._e()],1):t._e()]},proxy:!0}])},[t._v(" "+t._s(t.title)+" ")]),e("k-tabs",{attrs:{tab:t.tab,tabs:t.tabs}}),t.component?e(t.component,t._b({tag:"component"},"component",t.props,!1)):t._e(),t.styles?e("style",{tag:"component",domProps:{innerHTML:t._s(t.styles)}}):t._e()],1)}),[],!1,null,null,null,null).exports;export{r as default}; import{D as t}from"./Docs.min.js";import{n as e}from"./index.min.js";import"./vendor.min.js";const a=e({props:{docs:Object},emits:["cancel"],computed:{options(){const t=[{icon:"expand",link:"lab/docs/"+this.docs.component}];return this.docs.github&&t.unshift({icon:"github",link:this.docs.github,target:"_blank"}),t}}},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-form-drawer",attrs:{options:t.options},on:{submit:function(e){return t.$emit("cancel")}}},"k-drawer",t.$attrs,!1),[e("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[]).exports;const o=e({props:{code:{type:Boolean,default:!0},label:String,flex:Boolean},data:()=>({mode:"preview"}),computed:{component(){return window.UiExamples[this.label]}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-lab-example",attrs:{"data-flex":t.flex,tabindex:"0"}},[e("header",{staticClass:"k-lab-example-header"},[e("h3",{staticClass:"k-lab-example-label"},[t._v(t._s(t.label))]),t.code?e("k-button-group",{staticClass:"k-lab-example-inspector",attrs:{layout:"collapsed"}},[e("k-button",{attrs:{theme:"preview"===t.mode?"info":null,icon:"preview",size:"xs",title:"Preview"},on:{click:function(e){t.mode="preview"}}}),e("k-button",{attrs:{theme:"inspect"===t.mode?"info":null,icon:"code",size:"xs",title:"Vue code"},on:{click:function(e){t.mode="inspect"}}})],1):t._e()],1),"preview"===t.mode?e("div",{staticClass:"k-lab-example-canvas"},[t._t("default")],2):t._e(),"inspect"===t.mode?e("div",{staticClass:"k-lab-example-code"},[e("k-code",{attrs:{language:"html"}},[t._v(t._s(t.component))])],1):t._e()])}),[]).exports;const s=e({},(function(){return(0,this._self._c)("div",{staticClass:"k-lab-examples"},[this._t("default")],2)}),[]).exports;const n=e({methods:{submit(t){const e=Object.fromEntries(new FormData(t));this.$panel.dialog.open({component:"k-lab-output-dialog",props:{code:JSON.stringify(e,null,2)}})}}},(function(){var t=this,e=t._self._c;return e("form",{staticClass:"k-lab-form",on:{submit:function(e){return e.preventDefault(),t.submit(e.target)}}},[t._t("default"),e("footer",[e("k-button",{attrs:{type:"submit",icon:"check",theme:"positive",variant:"filled"}},[t._v(" Submit ")])],1)],2)}),[]).exports;const i=e({props:{code:String,language:{default:"js",type:String}},emits:["cancel"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({attrs:{size:"large","cancel-button":!1,"submit-button":!1},on:{cancel:function(e){return t.$emit("cancel")}}},"k-dialog",t.$attrs,!1),[e("k-code",{attrs:{language:t.language}},[t._v(t._s(t.code))])],1)}),[]).exports;const l=e({},(function(){var t=this._self._c;return t("div",{staticClass:"k-table"},[t("table",[t("tbody",[t("tr",[t("td",{staticClass:"k-table-cell",attrs:{"data-mobile":"true"}},[this._t("default")],2)])])])])}),[]).exports;Vue.component("k-lab-docs",t),Vue.component("k-lab-docs-drawer",a),Vue.component("k-lab-example",o),Vue.component("k-lab-examples",s),Vue.component("k-lab-form",n),Vue.component("k-lab-output-dialog",i),Vue.component("k-lab-table-cell",l);const r=e({props:{docs:String,examples:[Object,Array],file:String,github:String,props:[Object,Array],styles:String,tab:String,tabs:{type:Array,default:()=>[]},template:String,title:String},data:()=>({component:null}),watch:{tab:{handler(){this.createComponent()},immediate:!0}},mounted(){this.$panel.view.path.replace(/lab\//,"")},methods:{async createComponent(){if(!this.file)return;const{default:t}=await import(this.$panel.url(this.file)+"?cache="+Date.now());t.template=this.template,this.component={...t},window.UiExamples=this.examples},openDocs(){this.$panel.drawer.open(`lab/docs/${this.docs}`)},async reloadComponent(){await this.$panel.view.refresh(),this.createComponent()},reloadDocs(){this.$panel.drawer.isOpen&&this.$panel.drawer.refresh()}}},(function(){var t=this,e=t._self._c;return e("k-panel-inside",{staticClass:"k-lab-playground-view",attrs:{"data-has-tabs":t.tabs.length>1}},[e("k-header",{scopedSlots:t._u([{key:"buttons",fn:function(){return[t.docs||t.github?e("k-button-group",[t.docs?e("k-button",{attrs:{text:t.docs,icon:"book",size:"sm",variant:"filled"},on:{click:t.openDocs}}):t._e(),t.github?e("k-button",{attrs:{link:t.github,icon:"github",size:"sm",target:"_blank",variant:"filled"}}):t._e()],1):t._e()]},proxy:!0}])},[t._v(" "+t._s(t.title)+" ")]),e("k-tabs",{attrs:{tab:t.tab,tabs:t.tabs}}),t.component?e(t.component,t._b({tag:"component"},"component",t.props,!1)):t._e(),t.styles?e("style",{tag:"component",domProps:{innerHTML:t._s(t.styles)}}):t._e()],1)}),[]).exports;export{r as default};
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+3 -3
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+15 -24
View File
@@ -338,13 +338,12 @@ class File extends ModelWithContent
return false; return false;
} }
static $accessible = []; static $accessible = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->template() ?? '__none__';
$accessible[$role] ??= [];
if ($template = $this->template()) { return $accessible[$role][$template] ??= $this->permissions()->can('access');
return $accessible[$template] ??= $this->permissions()->can('access');
}
return $accessible['__none__'] ??= $this->permissions()->can('access');
} }
/** /**
@@ -363,13 +362,12 @@ class File extends ModelWithContent
return false; return false;
} }
static $listable = []; static $listable = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->template() ?? '__none__';
$listable[$role] ??= [];
if ($template = $this->template()) { return $listable[$role][$template] ??= $this->permissions()->can('list');
return $listable[$template] ??= $this->permissions()->can('list');
}
return $listable['__none__'] ??= $this->permissions()->can('list');
} }
/** /**
@@ -379,13 +377,12 @@ class File extends ModelWithContent
*/ */
public function isReadable(): bool public function isReadable(): bool
{ {
static $readable = []; static $readable = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->template() ?? '__none__';
$readable[$role] ??= [];
if ($template = $this->template()) { return $readable[$role][$template] ??= $this->permissions()->can('read');
return $readable[$template] ??= $this->permissions()->can('read');
}
return $readable['__none__'] ??= $this->permissions()->can('read');
} }
/** /**
@@ -633,12 +630,6 @@ class File extends ModelWithContent
case 'page': case 'page':
$preview = $parent->blueprint()->preview(); $preview = $parent->blueprint()->preview();
// user has no permission to preview page,
// also return null for file preview
if ($preview === false) {
return null;
}
// the page has a custom preview setting, // the page has a custom preview setting,
// thus the file is only accessible through // thus the file is only accessible through
// the direct media URL // the direct media URL
+11 -6
View File
@@ -139,10 +139,9 @@ trait FileActions
$file = $file->update(['template' => $template]); $file = $file->update(['template' => $template]);
// rename and/or resize the file if configured by new blueprint // resize the file if configured by new blueprint
$create = $file->blueprint()->create(); $create = $file->blueprint()->create();
$file = $file->manipulate($create); $file = $file->manipulate($create);
$file = $file->changeExtension($file, $create['format'] ?? null);
return $file; return $file;
}); });
@@ -185,6 +184,7 @@ trait FileActions
/** /**
* Copy the file to the given page * Copy the file to the given page
* @internal
*/ */
public function copy(Page $page): static public function copy(Page $page): static
{ {
@@ -285,7 +285,6 @@ trait FileActions
// resize the file on upload if configured // resize the file on upload if configured
$file = $file->manipulate($create); $file = $file->manipulate($create);
$file = $file->changeExtension($file, $create['format'] ?? null);
// store the content if necessary // store the content if necessary
// (always create files in the default language) // (always create files in the default language)
@@ -338,7 +337,14 @@ trait FileActions
// generate image file and overwrite it in place // generate image file and overwrite it in place
$this->kirby()->thumb($this->root(), $this->root(), $options); $this->kirby()->thumb($this->root(), $this->root(), $options);
return $this->clone([]); $file = $this->clone();
// change the file extension if format option configured
if ($format = $options['format'] ?? null) {
$file = $file->changeExtension($file, $format);
}
return $file;
} }
/** /**
@@ -387,7 +393,6 @@ trait FileActions
// apply the resizing/crop options from the blueprint // apply the resizing/crop options from the blueprint
$create = $file->blueprint()->create(); $create = $file->blueprint()->create();
$file = $file->manipulate($create); $file = $file->manipulate($create);
$file = $file->changeExtension($file, $create['format'] ?? null);
// return a fresh clone // return a fresh clone
return $file->clone(); return $file->clone();
+4 -4
View File
@@ -56,7 +56,7 @@ class LanguageVariable
throw new DuplicateException('The variable is part of the core translation and cannot be overwritten'); throw new DuplicateException('The variable is part of the core translation and cannot be overwritten');
} }
$translations[$key] = trim($value ?? ''); $translations[$key] = $value ?? '';
$language->update(['translations' => $translations]); $language->update(['translations' => $translations]);
@@ -102,10 +102,10 @@ class LanguageVariable
/** /**
* Sets a new value for the language variable * Sets a new value for the language variable
*/ */
public function update(string $value): static public function update(string|null $value = null): static
{ {
$translations = $this->language->translations(); $translations = $this->language->translations();
$translations[$this->key] = $value; $translations[$this->key] = $value ?? '';
$language = $this->language->update(['translations' => $translations]); $language = $this->language->update(['translations' => $translations]);
+3 -2
View File
@@ -42,8 +42,9 @@ class License
protected string|null $date = null, protected string|null $date = null,
protected string|null $signature = null, protected string|null $signature = null,
) { ) {
// normalize the email address // normalize arguments
$this->email = $this->email === null ? null : $this->normalizeEmail($this->email); $this->code = $this->code !== null ? trim($this->code) : null;
$this->email = $this->email !== null ? $this->normalizeEmail($this->email) : null;
} }
/** /**
+15 -12
View File
@@ -523,11 +523,12 @@ class Page extends ModelWithContent
return false; return false;
} }
static $accessible = []; static $accessible = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->intendedTemplate()->name();
$accessible[$role] ??= [];
$template = $this->intendedTemplate()->name(); return $accessible[$role][$template] ??= $this->permissions()->can('access');
return $accessible[$template] ??= $this->permissions()->can('access');
} }
/** /**
@@ -689,11 +690,12 @@ class Page extends ModelWithContent
return false; return false;
} }
static $listable = []; static $listable = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->intendedTemplate()->name();
$listable[$role] ??= [];
$template = $this->intendedTemplate()->name(); return $listable[$role][$template] ??= $this->permissions()->can('list');
return $listable[$template] ??= $this->permissions()->can('list');
} }
/** /**
@@ -745,11 +747,12 @@ class Page extends ModelWithContent
*/ */
public function isReadable(): bool public function isReadable(): bool
{ {
static $readable = []; static $readable = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->intendedTemplate()->name();
$readable[$role] ??= [];
$template = $this->intendedTemplate()->name(); return $readable[$role][$template] ??= $this->permissions()->can('read');
return $readable[$template] ??= $this->permissions()->can('read');
} }
/** /**
+8 -4
View File
@@ -153,7 +153,7 @@ trait PageActions
string|null $languageCode = null string|null $languageCode = null
): static { ): static {
// always sanitize the slug // always sanitize the slug
$slug = Str::slug($slug); $slug = Url::slug($slug);
// in multi-language installations the slug for the non-default // in multi-language installations the slug for the non-default
// languages is stored in the text file. The changeSlugForLanguage // languages is stored in the text file. The changeSlugForLanguage
@@ -431,6 +431,8 @@ trait PageActions
* Copies the page to a new parent * Copies the page to a new parent
* *
* @throws \Kirby\Exception\DuplicateException If the page already exists * @throws \Kirby\Exception\DuplicateException If the page already exists
*
* @internal
*/ */
public function copy(array $options = []): static public function copy(array $options = []): static
{ {
@@ -443,7 +445,7 @@ trait PageActions
$files = $options['files'] ?? false; $files = $options['files'] ?? false;
// clean up the slug // clean up the slug
$slug = Str::slug($slug); $slug = Url::slug($slug);
if ($parentModel->findPageOrDraft($slug)) { if ($parentModel->findPageOrDraft($slug)) {
throw new DuplicateException([ throw new DuplicateException([
@@ -495,7 +497,7 @@ trait PageActions
public static function create(array $props): Page public static function create(array $props): Page
{ {
// clean up the slug // clean up the slug
$props['slug'] = Str::slug($props['slug'] ?? $props['content']['title'] ?? null); $props['slug'] = Url::slug($props['slug'] ?? $props['content']['title'] ?? null);
$props['template'] = $props['model'] = strtolower($props['template'] ?? 'default'); $props['template'] = $props['model'] = strtolower($props['template'] ?? 'default');
$props['isDraft'] ??= $props['draft'] ?? true; $props['isDraft'] ??= $props['draft'] ?? true;
@@ -685,7 +687,7 @@ trait PageActions
public function duplicate(string|null $slug = null, array $options = []): static public function duplicate(string|null $slug = null, array $options = []): static
{ {
// create the slug for the duplicate // create the slug for the duplicate
$slug = Str::slug($slug ?? $this->slug() . '-' . Str::slug(I18n::translate('page.duplicate.appendix'))); $slug = Url::slug($slug ?? $this->slug() . '-' . Url::slug(I18n::translate('page.duplicate.appendix')));
$arguments = [ $arguments = [
'originalPage' => $this, 'originalPage' => $this,
@@ -762,6 +764,7 @@ trait PageActions
/** /**
* @return $this|static * @return $this|static
* @throws \Kirby\Exception\LogicException If the folder cannot be moved * @throws \Kirby\Exception\LogicException If the folder cannot be moved
* @internal
*/ */
public function publish(): static public function publish(): static
{ {
@@ -913,6 +916,7 @@ trait PageActions
/** /**
* Convert a page from listed or * Convert a page from listed or
* unlisted to draft. * unlisted to draft.
* @internal
* *
* @return $this|static * @return $this|static
* @throws \Kirby\Exception\LogicException If the folder cannot be moved * @throws \Kirby\Exception\LogicException If the folder cannot be moved
+28 -15
View File
@@ -365,27 +365,40 @@ class PageRules
$allowed = []; $allowed = [];
// collect all allowed subpage templates // collect all allowed subpage templates
foreach ($parent->blueprint()->sections() as $section) { // from all pages sections in the blueprint
// only take pages sections into consideration // (only consider page sections that list pages
if ($section->type() !== 'pages') { // of the targeted new parent page)
continue; $sections = array_filter(
} $parent->blueprint()->sections(),
fn ($section) =>
$section->type() === 'pages' &&
$section->parent()->is($parent)
);
// only consider page sections that list pages // check if the parent has at least one pages section
// of the targeted new parent page if ($sections === []) {
if ($section->parent() !== $parent) { throw new LogicException([
continue; 'key' => 'page.move.noSections',
} 'data' => [
'parent' => $parent->id() ?? '/',
]
]);
}
// go through all allowed blueprints and // go through all allowed templates and
// add the name to the allow list // add the name to the allowlist
foreach ($section->blueprints() as $blueprint) { foreach ($sections as $section) {
$allowed[] = $blueprint['name']; foreach ($section->templates() as $template) {
$allowed[] = $template;
} }
} }
// check if the template of this page is allowed as subpage type // check if the template of this page is allowed as subpage type
if (in_array($page->intendedTemplate()->name(), $allowed) === false) { // for the potential new parent
if (
$allowed !== [] &&
in_array($page->intendedTemplate()->name(), $allowed) === false
) {
throw new PermissionException([ throw new PermissionException([
'key' => 'page.move.template', 'key' => 'page.move.template',
'data' => [ 'data' => [
+10 -4
View File
@@ -25,15 +25,19 @@ class Roles extends Collection
/** /**
* Returns a filtered list of all * Returns a filtered list of all
* roles that can be created by the * roles that can be changed by the
* current user * current user
* *
* Use with `$kirby->roles()`. For retrieving
* which roles are available for a specific user,
* use `$user->roles()` without additional filters.
*
* @return $this|static * @return $this|static
* @throws \Exception * @throws \Exception
*/ */
public function canBeChanged(): static public function canBeChanged(): static
{ {
if (App::instance()->user()) { if (App::instance()->user()?->isAdmin() !== true) {
return $this->filter(function ($role) { return $this->filter(function ($role) {
$newUser = new User([ $newUser = new User([
'email' => 'test@getkirby.com', 'email' => 'test@getkirby.com',
@@ -50,14 +54,16 @@ class Roles extends Collection
/** /**
* Returns a filtered list of all * Returns a filtered list of all
* roles that can be created by the * roles that can be created by the
* current user * current user.
*
* Use with `$kirby->roles()`.
* *
* @return $this|static * @return $this|static
* @throws \Exception * @throws \Exception
*/ */
public function canBeCreated(): static public function canBeCreated(): static
{ {
if (App::instance()->user()) { if (App::instance()->user()?->isAdmin() !== true) {
return $this->filter(function ($role) { return $this->filter(function ($role) {
$newUser = new User([ $newUser = new User([
'email' => 'test@getkirby.com', 'email' => 'test@getkirby.com',
+1 -1
View File
@@ -26,7 +26,7 @@ class UpdateStatus
/** /**
* Host to request the update data from * Host to request the update data from
*/ */
public static string $host = 'https://assets.getkirby.com'; public static string $host = 'https://getkirby.com';
/** /**
* Marker that stores whether a previous remote * Marker that stores whether a previous remote
+21
View File
@@ -3,6 +3,7 @@
namespace Kirby\Cms; namespace Kirby\Cms;
use Kirby\Http\Url as BaseUrl; use Kirby\Http\Url as BaseUrl;
use Kirby\Toolkit\Str;
/** /**
* The `Url` class extends the * The `Url` class extends the
@@ -31,6 +32,26 @@ class Url extends BaseUrl
return App::instance()->url(); return App::instance()->url();
} }
/**
* Convert a string to a safe version to be used in a URL,
* obeying the `slugs.maxlength` option
*
* @param string $string The unsafe string
* @param string $separator To be used instead of space and
* other non-word characters.
* @param string $allowed List of all allowed characters (regex)
* @param int $maxlength The maximum length of the slug
* @return string The safe string
*/
public static function slug(
string $string = null,
string $separator = null,
string $allowed = null,
): string {
$maxlength = App::instance()->option('slugs.maxlength', 255);
return Str::slug($string, $separator, $allowed, $maxlength);
}
/** /**
* Creates an absolute Url to a template asset if it exists. * Creates an absolute Url to a template asset if it exists.
* This is used in the `css()` and `js()` helpers * This is used in the `css()` and `js()` helpers
+11 -20
View File
@@ -574,33 +574,24 @@ class User extends ModelWithContent
} }
/** /**
* Returns all available roles * Returns all available roles for this user,
* for this user, that can be selected * that the authenticated user can change to.
* by the authenticated user *
* For all roles the current user can create
* use `$kirby->roles()->canBeCreated()`.
*/ */
public function roles(): Roles public function roles(): Roles
{ {
$kirby = $this->kirby(); $kirby = $this->kirby();
$roles = $kirby->roles(); $roles = $kirby->roles();
// a collection with just the one role of the user // if the authenticated user doesn't have the permission to change
$myRole = $roles->filter('id', $this->role()->id()); // the role of this user, only the current role is available
if ($this->permissions()->can('changeRole') === false) {
// if there's an authenticated user … return $roles->filter('id', $this->role()->id());
// admin users can select pretty much any role
if ($kirby->user()?->isAdmin() === true) {
// except if the user is the last admin
if ($this->isLastAdmin() === true) {
// in which case they have to stay admin
return $myRole;
}
// return all roles for mighty admins
return $roles;
} }
// any other user can only keep their role return $roles->canBeCreated();
return $myRole;
} }
/** /**
@@ -666,7 +657,7 @@ class User extends ModelWithContent
*/ */
protected function siblingsCollection(): Users protected function siblingsCollection(): Users
{ {
return $this->kirby()->users(); return $this->kirby()->users()->sortBy('username', 'asc');
} }
/** /**
+14 -1
View File
@@ -26,7 +26,20 @@ class UserPermissions extends ModelPermissions
protected function canChangeRole(): bool protected function canChangeRole(): bool
{ {
return $this->model->roles()->count() > 1; // protect admin from role changes by non-admin
if (
$this->model->isAdmin() === true &&
$this->user->isAdmin() !== true
) {
return false;
}
// prevent demoting the last admin
if ($this->model->isLastAdmin() === true) {
return false;
}
return true;
} }
protected function canCreate(): bool protected function canCreate(): bool
+23 -21
View File
@@ -101,17 +101,6 @@ class UserRules
*/ */
public static function changeRole(User $user, string $role): bool public static function changeRole(User $user, string $role): bool
{ {
// protect admin from role changes by non-admin
if (
$user->kirby()->user()->isAdmin() === false &&
$user->isAdmin() === true
) {
throw new PermissionException([
'key' => 'user.changeRole.permission',
'data' => ['name' => $user->username()]
]);
}
// prevent non-admins making a user to admin // prevent non-admins making a user to admin
if ( if (
$user->kirby()->user()->isAdmin() === false && $user->kirby()->user()->isAdmin() === false &&
@@ -122,8 +111,7 @@ class UserRules
]); ]);
} }
static::validRole($user, $role); // prevent demoting the last admin
if ($role !== 'admin' && $user->isLastAdmin() === true) { if ($role !== 'admin' && $user->isLastAdmin() === true) {
throw new LogicException([ throw new LogicException([
'key' => 'user.changeRole.lastAdmin', 'key' => 'user.changeRole.lastAdmin',
@@ -131,6 +119,7 @@ class UserRules
]); ]);
} }
// check permissions
if ($user->permissions()->changeRole() !== true) { if ($user->permissions()->changeRole() !== true) {
throw new PermissionException([ throw new PermissionException([
'key' => 'user.changeRole.permission', 'key' => 'user.changeRole.permission',
@@ -138,6 +127,13 @@ class UserRules
]); ]);
} }
// prevent changing to role that is not available for user
if ($user->roles()->find($role) instanceof Role === false) {
throw new InvalidArgumentException([
'key' => 'user.role.invalid',
]);
}
return true; return true;
} }
@@ -199,22 +195,27 @@ class UserRules
return true; return true;
} }
// only admins are allowed to add admins // allow to create the first user
$role = $props['role'] ?? null; if ($user->kirby()->users()->count() === 0) {
return true;
}
if ($role === 'admin' && $currentUser?->isAdmin() === false) { // check user permissions
if ($user->permissions()->create() !== true) {
throw new PermissionException([ throw new PermissionException([
'key' => 'user.create.permission' 'key' => 'user.create.permission'
]); ]);
} }
// check user permissions (if not on install) $role = $props['role'] ?? null;
// prevent creating a role that is not available for user
if ( if (
$user->kirby()->users()->count() > 0 && in_array($role, [null, 'default', 'nobody'], true) === false &&
$user->permissions()->create() !== true $user->kirby()->roles()->canBeCreated()->find($role) instanceof Role === false
) { ) {
throw new PermissionException([ throw new InvalidArgumentException([
'key' => 'user.create.permission' 'key' => 'user.role.invalid',
]); ]);
} }
@@ -370,6 +371,7 @@ class UserRules
* Validates a user role * Validates a user role
* *
* @throws \Kirby\Exception\InvalidArgumentException If the user role does not exist * @throws \Kirby\Exception\InvalidArgumentException If the user role does not exist
* @deprecated 4.5.0
*/ */
public static function validRole(User $user, string $role): bool public static function validRole(User $user, string $role): bool
{ {
+10 -2
View File
@@ -124,9 +124,17 @@ class Field
*/ */
public function isEmpty(): bool public function isEmpty(): bool
{ {
$value = $this->value;
if (is_string($value) === true) {
$value = trim($value);
}
return return
empty($this->value) === true && $value === null ||
in_array($this->value, [0, '0', false], true) === false; $value === '' ||
$value === [] ||
$value === '[]';
} }
/** /**
+1
View File
@@ -28,6 +28,7 @@ class Image extends File
protected Dimensions|null $dimensions = null; protected Dimensions|null $dimensions = null;
public static array $resizableTypes = [ public static array $resizableTypes = [
'avif',
'jpg', 'jpg',
'jpeg', 'jpeg',
'gif', 'gif',
+12 -5
View File
@@ -28,7 +28,9 @@ class OptionsApi extends OptionsProvider
public string $url, public string $url,
public string|null $query = null, public string|null $query = null,
public string|null $text = null, public string|null $text = null,
public string|null $value = null public string|null $value = null,
public string|null $icon = null,
public string|null $info = null
) { ) {
} }
@@ -46,10 +48,12 @@ class OptionsApi extends OptionsProvider
} }
return new static( return new static(
url: $props['url'], url : $props['url'],
query: $props['query'] ?? $props['fetch'] ?? null, query: $props['query'] ?? $props['fetch'] ?? null,
text: $props['text'] ?? null, text : $props['text'] ?? null,
value: $props['value'] ?? null value: $props['value'] ?? null,
icon : $props['icon'] ?? null,
info : $props['info'] ?? null
); );
} }
@@ -138,7 +142,10 @@ class OptionsApi extends OptionsProvider
'value' => $model->toString($this->value, ['item' => $item]), 'value' => $model->toString($this->value, ['item' => $item]),
// text is only a raw string when using {< >} // text is only a raw string when using {< >}
// or when the safe mode is explicitly disabled (select field) // or when the safe mode is explicitly disabled (select field)
'text' => $model->$safeMethod($this->text, ['item' => $item]) 'text' => $model->$safeMethod($this->text, ['item' => $item]),
// additional data
'icon' => $this->icon !== null ? $model->toString($this->icon, ['item' => $item]) : null,
'info' => $this->info !== null ? $model->$safeMethod($this->info, ['item' => $item]) : null
]; ];
} }
+12 -4
View File
@@ -30,7 +30,9 @@ class OptionsQuery extends OptionsProvider
public function __construct( public function __construct(
public string $query, public string $query,
public string|null $text = null, public string|null $text = null,
public string|null $value = null public string|null $value = null,
public string|null $icon = null,
public string|null $info = null
) { ) {
} }
@@ -56,8 +58,10 @@ class OptionsQuery extends OptionsProvider
return new static( return new static(
query: $props['query'] ?? $props['fetch'], query: $props['query'] ?? $props['fetch'],
text: $props['text'] ?? null, text : $props['text'] ?? null,
value: $props['value'] ?? null value: $props['value'] ?? null,
icon : $props['icon'] ?? null,
info : $props['info'] ?? null
); );
} }
@@ -178,7 +182,11 @@ class OptionsQuery extends OptionsProvider
$safeMethod = $safeMode === true ? 'toSafeString' : 'toString'; $safeMethod = $safeMode === true ? 'toSafeString' : 'toString';
$text = $model->$safeMethod($this->text ?? $text, $data); $text = $model->$safeMethod($this->text ?? $text, $data);
return compact('text', 'value'); // additional data
$icon = $this->icon !== null ? $model->toString($this->icon, $data) : null;
$info = $this->info !== null ? $model->$safeMethod($this->info, $data) : null;
return compact('text', 'value', 'icon', 'info');
}); });
return $this->options = Options::factory($options); return $this->options = Options::factory($options);
+23 -18
View File
@@ -6,6 +6,7 @@ use Kirby\Cms\App;
use Kirby\Cms\File; use Kirby\Cms\File;
use Kirby\Cms\ModelWithContent; use Kirby\Cms\ModelWithContent;
use Kirby\Cms\Page; use Kirby\Cms\Page;
use Kirby\Cms\Roles;
use Kirby\Form\Form; use Kirby\Form\Form;
use Kirby\Http\Router; use Kirby\Http\Router;
use Kirby\Toolkit\I18n; use Kirby\Toolkit\I18n;
@@ -191,29 +192,33 @@ class Field
/** /**
* User role radio buttons * User role radio buttons
*/ */
public static function role(array $props = []): array public static function role(
{ array $props = [],
$kirby = App::instance(); Roles|null $roles = null
$isAdmin = $kirby->user()?->isAdmin() ?? false; ): array {
$roles = []; $kirby = App::instance();
foreach ($kirby->roles() as $role) { // if no $roles where provided, fall back to all roles
// exclude the admin role, if the user $roles ??= $kirby->roles();
// is not allowed to change role to admin
if ($role->name() === 'admin' && $isAdmin === false) {
continue;
}
$roles[] = [ // exclude the admin role, if the user
'text' => $role->title(), // is not allowed to change role to admin
'info' => $role->description() ?? I18n::translate('role.description.placeholder'), $roles = $roles->filter(
'value' => $role->name() fn ($role) =>
]; $role->name() !== 'admin' ||
} $kirby->user()?->isAdmin() === true
);
// turn roles into radio field options
$roles = $roles->values(fn ($role) => [
'text' => $role->title(),
'info' => $role->description() ?? I18n::translate('role.description.placeholder'),
'value' => $role->name()
]);
return array_merge([ return array_merge([
'label' => I18n::translate('role'), 'label' => I18n::translate('role'),
'type' => count($roles) <= 1 ? 'hidden' : 'radio', 'type' => count($roles) < 1 ? 'hidden' : 'radio',
'options' => $roles 'options' => $roles
], $props); ], $props);
} }
+4 -7
View File
@@ -54,6 +54,7 @@ class PageCreateDialog
'tags', 'tags',
'tel', 'tel',
'text', 'text',
'toggle',
'toggles', 'toggles',
'time', 'time',
'url' 'url'
@@ -247,8 +248,9 @@ class PageCreateDialog
*/ */
public function model(): Page public function model(): Page
{ {
// TODO: use actual in-memory page in v5
return $this->model ??= Page::factory([ return $this->model ??= Page::factory([
'slug' => 'new', 'slug' => '__new__',
'template' => $this->template, 'template' => $this->template,
'model' => $this->template, 'model' => $this->template,
'parent' => $this->parent instanceof Page ? $this->parent : null 'parent' => $this->parent instanceof Page ? $this->parent : null
@@ -266,12 +268,7 @@ class PageCreateDialog
// create temporary page object // create temporary page object
// to resolve the template strings // to resolve the template strings
$page = new Page([ $page = $this->model()->clone(['content' => $input]);
'slug' => 'tmp',
'template' => $this->template,
'parent' => $this->model(),
'content' => $input
]);
if (is_string($title)) { if (is_string($title)) {
$input['title'] = $page->toSafeString($title); $input['title'] = $page->toSafeString($title);
+10 -5
View File
@@ -70,7 +70,7 @@ class User extends Model
'dialog' => $url . '/changeRole', 'dialog' => $url . '/changeRole',
'icon' => 'bolt', 'icon' => 'bolt',
'text' => I18n::translate('user.changeRole'), 'text' => I18n::translate('user.changeRole'),
'disabled' => $this->isDisabledDropdownOption('changeRole', $options, $permissions) 'disabled' => $this->isDisabledDropdownOption('changeRole', $options, $permissions) || $this->model->roles()->count() < 2
]; ];
$result[] = [ $result[] = [
@@ -218,14 +218,19 @@ class User extends Model
*/ */
public function props(): array public function props(): array
{ {
$user = $this->model; $user = $this->model;
$account = $user->isLoggedIn(); $account = $user->isLoggedIn();
$permissions = $this->options();
return array_merge( return array_merge(
parent::props(), parent::props(),
$account ? [] : $this->prevNext(), $this->prevNext(),
[ [
'blueprint' => $this->model->role()->name(), 'blueprint' => $this->model->role()->name(),
'canChangeEmail' => $permissions['changeEmail'],
'canChangeLanguage' => $permissions['changeLanguage'],
'canChangeName' => $permissions['changeName'],
'canChangeRole' => $this->model->roles()->count() > 1,
'model' => [ 'model' => [
'account' => $account, 'account' => $account,
'avatar' => $user->avatar()?->url(), 'avatar' => $user->avatar()?->url(),
+3
View File
@@ -275,6 +275,9 @@ class View
return [ return [
'$config' => fn () => [ '$config' => fn () => [
'api' => [
'methodOverwrite' => $kirby->option('api.methodOverwrite', true)
],
'debug' => $kirby->option('debug', false), 'debug' => $kirby->option('debug', false),
'kirbytext' => $kirby->option('panel.kirbytext', true), 'kirbytext' => $kirby->option('panel.kirbytext', true),
'translation' => $kirby->option('panel.language', 'en'), 'translation' => $kirby->option('panel.language', 'en'),
-2
View File
@@ -96,8 +96,6 @@ class Collection extends Iterator implements Countable
* Low-level setter for elements * Low-level setter for elements
* *
* @param string $key string or array * @param string $key string or array
* @param mixed $value
* @return void
*/ */
public function __set(string $key, $value): void public function __set(string $key, $value): void
{ {
+8
View File
@@ -102,4 +102,12 @@ class Obj extends stdClass
{ {
return json_encode($this->toArray(), ...$arguments); return json_encode($this->toArray(), ...$arguments);
} }
/**
* Returns the property names as keys
*/
public function toKeys(): array
{
return array_keys((array)$this);
}
} }
+6 -2
View File
@@ -1132,7 +1132,7 @@ class Str
string $string = null, string $string = null,
string $separator = null, string $separator = null,
string $allowed = null, string $allowed = null,
int $maxlength = 128 int|false $maxlength = 128
): string { ): string {
$separator ??= static::$defaults['slug']['separator']; $separator ??= static::$defaults['slug']['separator'];
$allowed ??= static::$defaults['slug']['allowed']; $allowed ??= static::$defaults['slug']['allowed'];
@@ -1165,7 +1165,11 @@ class Str
$string = preg_replace('![^a-z0-9]+$!', '', $string); $string = preg_replace('![^a-z0-9]+$!', '', $string);
// cut the string after the given maxlength // cut the string after the given maxlength
return static::short($string, $maxlength, ''); if ($maxlength !== false) {
$string = static::short($string, $maxlength, '');
}
return $string;
} }
/** /**
+15
View File
@@ -3,6 +3,7 @@
namespace Kirby\Uuid; namespace Kirby\Uuid;
use Generator; use Generator;
use Kirby\Cms\App;
use Kirby\Cms\File; use Kirby\Cms\File;
/** /**
@@ -83,4 +84,18 @@ class FileUuid extends ModelUuid
'filename' => $model->filename() 'filename' => $model->filename()
]; ];
} }
/**
* Returns permalink url
*/
public function url(): string
{
// make sure UUID is cached because the permalink
// route only looks up UUIDs from cache
if ($this->isCached() === false) {
$this->populate();
}
return App::instance()->url() . '/@/' . static::TYPE . '/' . $this->id();
}
} }
-16
View File
@@ -2,8 +2,6 @@
namespace Kirby\Uuid; namespace Kirby\Uuid;
use Kirby\Cms\App;
/** /**
* Base for UUIDs for models where id string * Base for UUIDs for models where id string
* is stored in the content, such as pages and files * is stored in the content, such as pages and files
@@ -107,18 +105,4 @@ abstract class ModelUuid extends Uuid
// use the most basic write method to avoid object cloning // use the most basic write method to avoid object cloning
$this->model->writeContent($data, 'default'); $this->model->writeContent($data, 'default');
} }
/**
* Returns permalink url
*/
public function url(): string
{
// make sure UUID is cached because the permalink
// route only looks up UUIDs from cache
if ($this->isCached() === false) {
$this->populate();
}
return App::instance()->url() . '/@/' . static::TYPE . '/' . $this->id();
}
} }
+21
View File
@@ -54,4 +54,25 @@ class PageUuid extends ModelUuid
yield from static::index($page); yield from static::index($page);
} }
} }
/**
* Returns permalink url
*/
public function url(): string
{
// make sure UUID is cached because the permalink
// route only looks up UUIDs from cache
if ($this->isCached() === false) {
$this->populate();
}
$kirby = App::instance();
$url = $kirby->url();
if ($language = $kirby->language('current')) {
$url .= '/' . $language->code();
}
return $url . '/@/' . static::TYPE . '/' . $this->id();
}
} }
+5
View File
@@ -0,0 +1,5 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/yaml-lint
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
php "%BIN_TARGET%" %*
+63 -64
View File
@@ -120,27 +120,27 @@
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
"version": "3.4.2", "version": "3.4.3",
"version_normalized": "3.4.2.0", "version_normalized": "3.4.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/semver.git", "url": "https://github.com/composer/semver.git",
"reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^5.3.2 || ^7.0 || ^8.0" "php": "^5.3.2 || ^7.0 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.4", "phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^4.2 || ^5" "symfony/phpunit-bridge": "^3 || ^7"
}, },
"time": "2024-07-12T11:35:52+00:00", "time": "2024-09-19T14:15:21+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -184,7 +184,7 @@
"support": { "support": {
"irc": "ircs://irc.libera.chat:6697/composer", "irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues", "issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.2" "source": "https://github.com/composer/semver/tree/3.4.3"
}, },
"funding": [ "funding": [
{ {
@@ -204,33 +204,33 @@
}, },
{ {
"name": "filp/whoops", "name": "filp/whoops",
"version": "2.15.4", "version": "2.16.0",
"version_normalized": "2.15.4.0", "version_normalized": "2.16.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/filp/whoops.git", "url": "https://github.com/filp/whoops.git",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" "reference": "befcdc0e5dce67252aa6322d82424be928214fa2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", "reference": "befcdc0e5dce67252aa6322d82424be928214fa2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^5.5.9 || ^7.0 || ^8.0", "php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0" "psr/log": "^1.0.1 || ^2.0 || ^3.0"
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "^0.9 || ^1.0", "mockery/mockery": "^1.0",
"phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
"symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" "symfony/var-dumper": "^4.0 || ^5.0"
}, },
"suggest": { "suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available", "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
"whoops/soap": "Formats errors as SOAP responses" "whoops/soap": "Formats errors as SOAP responses"
}, },
"time": "2023-11-03T12:00:00+00:00", "time": "2024-09-25T12:00:00+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -266,7 +266,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/filp/whoops/issues", "issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.15.4" "source": "https://github.com/filp/whoops/tree/2.16.0"
}, },
"funding": [ "funding": [
{ {
@@ -328,36 +328,36 @@
}, },
{ {
"name": "laminas/laminas-escaper", "name": "laminas/laminas-escaper",
"version": "2.13.0", "version": "2.14.0",
"version_normalized": "2.13.0.0", "version_normalized": "2.14.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laminas/laminas-escaper.git", "url": "https://github.com/laminas/laminas-escaper.git",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/0f7cb975f4443cf22f33408925c231225cfba8cb",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "~8.1.0 || ~8.2.0 || ~8.3.0" "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"conflict": { "conflict": {
"zendframework/zend-escaper": "*" "zendframework/zend-escaper": "*"
}, },
"require-dev": { "require-dev": {
"infection/infection": "^0.27.0", "infection/infection": "^0.27.9",
"laminas/laminas-coding-standard": "~2.5.0", "laminas/laminas-coding-standard": "~3.0.0",
"maglnet/composer-require-checker": "^3.8.0", "maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.6.7", "phpunit/phpunit": "^9.6.16",
"psalm/plugin-phpunit": "^0.18.4", "psalm/plugin-phpunit": "^0.19.0",
"vimeo/psalm": "^5.9" "vimeo/psalm": "^5.21.1"
}, },
"time": "2023-10-10T08:35:13+00:00", "time": "2024-10-24T10:12:53+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -514,17 +514,17 @@
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v6.9.1", "version": "v6.9.2",
"version_normalized": "6.9.1.0", "version_normalized": "6.9.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18" "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a7b17b42fa4887c92146243f3d2f4ccb962af17c",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18", "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -554,7 +554,7 @@
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
"thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
}, },
"time": "2023-11-25T22:23:28+00:00", "time": "2024-10-09T10:07:50+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -586,7 +586,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": { "support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues", "issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.2"
}, },
"funding": [ "funding": [
{ {
@@ -803,28 +803,27 @@
}, },
{ {
"name": "symfony/polyfill-intl-idn", "name": "symfony/polyfill-intl-idn",
"version": "v1.30.0", "version": "v1.31.0",
"version_normalized": "1.30.0.0", "version_normalized": "1.31.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git", "url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1", "php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-intl-normalizer": "^1.10"
"symfony/polyfill-php72": "^1.10"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"time": "2024-05-31T15:07:36+00:00", "time": "2024-09-09T11:45:10+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
@@ -870,7 +869,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@@ -974,21 +973,21 @@
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.30.0", "version": "v1.31.0",
"version_normalized": "1.30.0.0", "version_normalized": "1.31.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-mbstring": "*" "ext-mbstring": "*"
@@ -996,7 +995,7 @@
"suggest": { "suggest": {
"ext-mbstring": "For best performance" "ext-mbstring": "For best performance"
}, },
"time": "2024-06-19T12:30:46+00:00", "time": "2024-09-09T11:45:10+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
@@ -1037,7 +1036,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@@ -1057,17 +1056,17 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v6.4.11", "version": "v6.4.13",
"version_normalized": "6.4.11.0", "version_normalized": "6.4.13.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "be37e7f13195e05ab84ca5269365591edd240335" "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335", "url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9",
"reference": "be37e7f13195e05ab84ca5269365591edd240335", "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1081,7 +1080,7 @@
"require-dev": { "require-dev": {
"symfony/console": "^5.4|^6.0|^7.0" "symfony/console": "^5.4|^6.0|^7.0"
}, },
"time": "2024-08-12T09:55:28+00:00", "time": "2024-09-25T14:18:03+00:00",
"bin": [ "bin": [
"Resources/bin/yaml-lint" "Resources/bin/yaml-lint"
], ],
@@ -1112,7 +1111,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v6.4.11" "source": "https://github.com/symfony/yaml/tree/v6.4.13"
}, },
"funding": [ "funding": [
{ {
+25 -25
View File
@@ -1,8 +1,8 @@
<?php return array( <?php return array(
'root' => array( 'root' => array(
'name' => 'getkirby/cms', 'name' => 'getkirby/cms',
'pretty_version' => '4.4.1', 'pretty_version' => '4.5.0',
'version' => '4.4.1.0', 'version' => '4.5.0.0',
'reference' => null, 'reference' => null,
'type' => 'kirby-cms', 'type' => 'kirby-cms',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
@@ -29,26 +29,26 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'composer/semver' => array( 'composer/semver' => array(
'pretty_version' => '3.4.2', 'pretty_version' => '3.4.3',
'version' => '3.4.2.0', 'version' => '3.4.3.0',
'reference' => 'c51258e759afdb17f1fd1fe83bc12baaef6309d6', 'reference' => '4313d26ada5e0c4edfbd1dc481a92ff7bff91f12',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/./semver', 'install_path' => __DIR__ . '/./semver',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'filp/whoops' => array( 'filp/whoops' => array(
'pretty_version' => '2.15.4', 'pretty_version' => '2.16.0',
'version' => '2.15.4.0', 'version' => '2.16.0.0',
'reference' => 'a139776fa3f5985a50b509f2a02ff0f709d2a546', 'reference' => 'befcdc0e5dce67252aa6322d82424be928214fa2',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../filp/whoops', 'install_path' => __DIR__ . '/../filp/whoops',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'getkirby/cms' => array( 'getkirby/cms' => array(
'pretty_version' => '4.4.1', 'pretty_version' => '4.5.0',
'version' => '4.4.1.0', 'version' => '4.5.0.0',
'reference' => null, 'reference' => null,
'type' => 'kirby-cms', 'type' => 'kirby-cms',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
@@ -65,9 +65,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'laminas/laminas-escaper' => array( 'laminas/laminas-escaper' => array(
'pretty_version' => '2.13.0', 'pretty_version' => '2.14.0',
'version' => '2.13.0.0', 'version' => '2.14.0.0',
'reference' => 'af459883f4018d0f8a0c69c7a209daef3bf973ba', 'reference' => '0f7cb975f4443cf22f33408925c231225cfba8cb',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../laminas/laminas-escaper', 'install_path' => __DIR__ . '/../laminas/laminas-escaper',
'aliases' => array(), 'aliases' => array(),
@@ -98,9 +98,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'phpmailer/phpmailer' => array( 'phpmailer/phpmailer' => array(
'pretty_version' => 'v6.9.1', 'pretty_version' => 'v6.9.2',
'version' => '6.9.1.0', 'version' => '6.9.2.0',
'reference' => '039de174cd9c17a8389754d3b877a2ed22743e18', 'reference' => 'a7b17b42fa4887c92146243f3d2f4ccb962af17c',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../phpmailer/phpmailer', 'install_path' => __DIR__ . '/../phpmailer/phpmailer',
'aliases' => array(), 'aliases' => array(),
@@ -134,9 +134,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-intl-idn' => array( 'symfony/polyfill-intl-idn' => array(
'pretty_version' => 'v1.30.0', 'pretty_version' => 'v1.31.0',
'version' => '1.30.0.0', 'version' => '1.31.0.0',
'reference' => 'a6e83bdeb3c84391d1dfe16f42e40727ce524a5c', 'reference' => 'c36586dcf89a12315939e00ec9b4474adcb1d773',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn',
'aliases' => array(), 'aliases' => array(),
@@ -152,9 +152,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-mbstring' => array( 'symfony/polyfill-mbstring' => array(
'pretty_version' => 'v1.30.0', 'pretty_version' => 'v1.31.0',
'version' => '1.30.0.0', 'version' => '1.31.0.0',
'reference' => 'fd22ab50000ef01661e2a31d850ebaa297f8e03c', 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(), 'aliases' => array(),
@@ -167,9 +167,9 @@
), ),
), ),
'symfony/yaml' => array( 'symfony/yaml' => array(
'pretty_version' => 'v6.4.11', 'pretty_version' => 'v6.4.13',
'version' => '6.4.11.0', 'version' => '6.4.13.0',
'reference' => 'be37e7f13195e05ab84ca5269365591edd240335', 'reference' => 'e99b4e94d124b29ee4cf3140e1b537d2dad8cec9',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/yaml', 'install_path' => __DIR__ . '/../symfony/yaml',
'aliases' => array(), 'aliases' => array(),
+2 -2
View File
@@ -34,8 +34,8 @@
"php": "^5.3.2 || ^7.0 || ^8.0" "php": "^5.3.2 || ^7.0 || ^8.0"
}, },
"require-dev": { "require-dev": {
"symfony/phpunit-bridge": "^4.2 || ^5", "symfony/phpunit-bridge": "^3 || ^7",
"phpstan/phpstan": "^1.4" "phpstan/phpstan": "^1.11"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
+1 -1
View File
@@ -64,7 +64,7 @@ class CompilingMatcher
* @phpstan-param Constraint::OP_* $operator * @phpstan-param Constraint::OP_* $operator
* @param string $version * @param string $version
* *
* @return mixed * @return bool
*/ */
public static function match(ConstraintInterface $constraint, $operator, $version) public static function match(ConstraintInterface $constraint, $operator, $version)
{ {
+4 -4
View File
@@ -15,13 +15,13 @@
"test": "phpunit --testdox tests" "test": "phpunit --testdox tests"
}, },
"require": { "require": {
"php": "^5.5.9 || ^7.0 || ^8.0", "php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0" "psr/log": "^1.0.1 || ^2.0 || ^3.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
"mockery/mockery": "^0.9 || ^1.0", "mockery/mockery": "^1.0",
"symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" "symfony/var-dumper": "^4.0 || ^5.0"
}, },
"suggest": { "suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available", "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -383,7 +383,7 @@ class PrettyPageHandler extends Handler
throw new InvalidArgumentException('Expecting callback argument to be callable'); throw new InvalidArgumentException('Expecting callback argument to be callable');
} }
$this->extraTables[$label] = function (\Whoops\Inspector\InspectorInterface $inspector = null) use ($callback) { $this->extraTables[$label] = function (?\Whoops\Inspector\InspectorInterface $inspector = null) use ($callback) {
try { try {
$result = call_user_func($callback, $inspector); $result = call_user_func($callback, $inspector);
+1 -1
View File
@@ -81,7 +81,7 @@ final class Run implements RunInterface
*/ */
private $frameFilters = []; private $frameFilters = [];
public function __construct(SystemFacade $system = null) public function __construct(?SystemFacade $system = null)
{ {
$this->system = $system ?: new SystemFacade; $this->system = $system ?: new SystemFacade;
$this->inspectorFactory = new InspectorFactory(); $this->inspectorFactory = new InspectorFactory();
@@ -233,7 +233,7 @@ class TemplateHelper
* *
* @param string $template * @param string $template
*/ */
public function render($template, array $additionalVariables = null) public function render($template, ?array $additionalVariables = null)
{ {
$variables = $this->getVariables(); $variables = $this->getVariables();
+6 -6
View File
@@ -29,17 +29,17 @@
"extra": { "extra": {
}, },
"require": { "require": {
"php": "~8.1.0 || ~8.2.0 || ~8.3.0", "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0",
"ext-ctype": "*", "ext-ctype": "*",
"ext-mbstring": "*" "ext-mbstring": "*"
}, },
"require-dev": { "require-dev": {
"infection/infection": "^0.27.0", "infection/infection": "^0.27.9",
"laminas/laminas-coding-standard": "~2.5.0", "laminas/laminas-coding-standard": "~3.0.0",
"maglnet/composer-require-checker": "^3.8.0", "maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.6.7", "phpunit/phpunit": "^9.6.16",
"psalm/plugin-phpunit": "^0.18.4", "psalm/plugin-phpunit": "^0.19.0",
"vimeo/psalm": "^5.9" "vimeo/psalm": "^5.21.1"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
+2 -1
View File
@@ -28,7 +28,8 @@
"config": { "config": {
"allow-plugins": { "allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true "dealerdirect/phpcodesniffer-composer-installer": true
} },
"lock": false
}, },
"require": { "require": {
"php": ">=5.5.0", "php": ">=5.5.0",
+3 -3
View File
@@ -12,7 +12,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
@@ -36,7 +36,7 @@ namespace PHPMailer\PHPMailer;
* Aliases for League Provider Classes * Aliases for League Provider Classes
* Make sure you have added these to your composer.json and run `composer install` * Make sure you have added these to your composer.json and run `composer install`
* Plenty to choose from here: * Plenty to choose from here:
* @see http://oauth2-client.thephpleague.com/providers/thirdparty/ * @see https://oauth2-client.thephpleague.com/providers/thirdparty/
*/ */
//@see https://github.com/thephpleague/oauth2-google //@see https://github.com/thephpleague/oauth2-google
use League\OAuth2\Client\Provider\Google; use League\OAuth2\Client\Provider\Google;
@@ -178,5 +178,5 @@ if (!isset($_GET['code'])) {
); );
//Use this to interact with an API on the users behalf //Use this to interact with an API on the users behalf
//Use this to get a new access token if the old one expires //Use this to get a new access token if the old one expires
echo 'Refresh Token: ', $token->getRefreshToken(); echo 'Refresh Token: ', htmlspecialchars($token->getRefreshToken());
} }
@@ -5,27 +5,32 @@
* @package PHPMailer * @package PHPMailer
* @author Matt Sturdy <matt.sturdy@gmail.com> * @author Matt Sturdy <matt.sturdy@gmail.com>
* @author Crystopher Glodzienski Cardoso <crystopher.glodzienski@gmail.com> * @author Crystopher Glodzienski Cardoso <crystopher.glodzienski@gmail.com>
* @author Daniel Cruz <danicruz0415@gmail.com>
*/ */
$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.'; $PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.';
$PHPMAILER_LANG['buggy_php'] = 'Tu versión de PHP está afectada por un bug que puede resultar en mensajes corruptos. Para arreglarlo, cambia a enviar usando SMTP, deshabilita la opción mail.add_x_header en tu php.ini, cambia a MacOS o Linux, o actualiza tu PHP a la versión 7.0.17+ o 7.1.3+.';
$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.'; $PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.'; $PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.';
$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.'; $PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.';
$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: '; $PHPMAILER_LANG['encoding'] = 'Codificación desconocida: ';
$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: '; $PHPMAILER_LANG['execute'] = 'Imposible ejecutar: ';
$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: ';
$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: '; $PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: ';
$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: '; $PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: ';
$PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: '; $PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.'; $PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.';
$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: '; $PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: ';
$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido';
$PHPMAILER_LANG['invalid_hostentry'] = 'Hostentry inválido: ';
$PHPMAILER_LANG['invalid_host'] = 'Host inválido: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.'; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.';
$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.'; $PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.';
$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: '; $PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: ';
$PHPMAILER_LANG['signing'] = 'Error al firmar: '; $PHPMAILER_LANG['signing'] = 'Error al firmar: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.';
$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: ';
$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: ';
$PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: '; $PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: '; $PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: ';
$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido'; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.';
$PHPMAILER_LANG['smtp_detail'] = 'Detalle: ';
$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: ';
@@ -6,7 +6,6 @@
* Some French punctuation requires a thin non-breaking space (U+202F) character before it, * Some French punctuation requires a thin non-breaking space (U+202F) character before it,
* for example before a colon or exclamation mark. * for example before a colon or exclamation mark.
* There is one of these characters between these quotes: " " * There is one of these characters between these quotes: " "
* @see http://unicode.org/udhr/n/notes_fra.html
*/ */
$PHPMAILER_LANG['authenticate'] = 'Erreur SMTP : échec de l’authentification.'; $PHPMAILER_LANG['authenticate'] = 'Erreur SMTP : échec de l’authentification.';
@@ -31,7 +30,7 @@ $PHPMAILER_LANG['recipients_failed'] = 'Erreur SMTP : les destinataires s
$PHPMAILER_LANG['signing'] = 'Erreur de signature : '; $PHPMAILER_LANG['signing'] = 'Erreur de signature : ';
$PHPMAILER_LANG['smtp_code'] = 'Code SMTP : '; $PHPMAILER_LANG['smtp_code'] = 'Code SMTP : ';
$PHPMAILER_LANG['smtp_code_ex'] = 'Informations supplémentaires SMTP : '; $PHPMAILER_LANG['smtp_code_ex'] = 'Informations supplémentaires SMTP : ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'La fonction SMTP connect() a échouée.'; $PHPMAILER_LANG['smtp_connect_failed'] = 'La fonction SMTP connect() a échoué.';
$PHPMAILER_LANG['smtp_detail'] = 'Détails : '; $PHPMAILER_LANG['smtp_detail'] = 'Détails : ';
$PHPMAILER_LANG['smtp_error'] = 'Erreur du serveur SMTP : '; $PHPMAILER_LANG['smtp_error'] = 'Erreur du serveur SMTP : ';
$PHPMAILER_LANG['variable_set'] = 'Impossible d’initialiser ou de réinitialiser une variable : '; $PHPMAILER_LANG['variable_set'] = 'Impossible d’initialiser ou de réinitialiser une variable : ';
@@ -3,27 +3,35 @@
/** /**
* Japanese PHPMailer language file: refer to English translation for definitive list * Japanese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer
* @author Mitsuhiro Yoshida <http://mitstek.com/> * @author Mitsuhiro Yoshida <https://mitstek.com>
* @author Yoshi Sakai <http://bluemooninc.jp/> * @author Yoshi Sakai <http://bluemooninc.jp/>
* @author Arisophy <https://github.com/arisophy/> * @author Arisophy <https://github.com/arisophy/>
* @author ARAKI Musashi <https://github.com/arakim/>
*/ */
$PHPMAILER_LANG['authenticate'] = 'SMTPエラー: 認証できませんでした。'; $PHPMAILER_LANG['authenticate'] = 'SMTPエラー: 認証できませんでした。';
$PHPMAILER_LANG['buggy_php'] = 'ご利用のバージョンのPHPには不具合があり、メッセージが破損するおそれがあります。問題の解決は以下のいずれかを行ってください。SMTPでの送信に切り替える。php.iniのmail.add_x_headerをoffにする。MacOSまたはLinuxに切り替える。PHPバージョン7.0.17以降または7.1.3以降にアップグレードする。';
$PHPMAILER_LANG['connect_host'] = 'SMTPエラー: SMTPホストに接続できませんでした。'; $PHPMAILER_LANG['connect_host'] = 'SMTPエラー: SMTPホストに接続できませんでした。';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTPエラー: データが受け付けられませんでした。'; $PHPMAILER_LANG['data_not_accepted'] = 'SMTPエラー: データが受け付けられませんでした。';
$PHPMAILER_LANG['empty_message'] = 'メール本文が空です。'; $PHPMAILER_LANG['empty_message'] = 'メール本文が空です。';
$PHPMAILER_LANG['encoding'] = '不明なエンコーディング: '; $PHPMAILER_LANG['encoding'] = '不明なエンコーディング: ';
$PHPMAILER_LANG['execute'] = '実行できませんでした: '; $PHPMAILER_LANG['execute'] = '実行できませんでした: ';
$PHPMAILER_LANG['extension_missing'] = '拡張機能が見つかりません: ';
$PHPMAILER_LANG['file_access'] = 'ファイルにアクセスできません: '; $PHPMAILER_LANG['file_access'] = 'ファイルにアクセスできません: ';
$PHPMAILER_LANG['file_open'] = 'ファイルエラー: ファイルを開けません: '; $PHPMAILER_LANG['file_open'] = 'ファイルエラー: ファイルを開けません: ';
$PHPMAILER_LANG['from_failed'] = 'Fromアドレスを登録する際にエラーが発生しました: '; $PHPMAILER_LANG['from_failed'] = 'Fromアドレスを登録する際にエラーが発生しました: ';
$PHPMAILER_LANG['instantiate'] = 'メール関数が正常に動作しませんでした。'; $PHPMAILER_LANG['instantiate'] = 'メール関数が正常に動作しませんでした。';
$PHPMAILER_LANG['invalid_address'] = '不正なメールアドレス: '; $PHPMAILER_LANG['invalid_address'] = '不正なメールアドレス: ';
$PHPMAILER_LANG['provide_address'] = '少なくとも1つメールアドレスを 指定する必要があります。'; $PHPMAILER_LANG['invalid_header'] = '不正なヘッダー名またはその内容';
$PHPMAILER_LANG['invalid_hostentry'] = '不正なホストエントリー: ';
$PHPMAILER_LANG['invalid_host'] = '不正なホスト: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。'; $PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。';
$PHPMAILER_LANG['provide_address'] = '少なくとも1つメールアドレスを 指定する必要があります。';
$PHPMAILER_LANG['recipients_failed'] = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: '; $PHPMAILER_LANG['recipients_failed'] = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: ';
$PHPMAILER_LANG['signing'] = '署名エラー: '; $PHPMAILER_LANG['signing'] = '署名エラー: ';
$PHPMAILER_LANG['smtp_code'] = 'SMTPコード: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'SMTP追加情報: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP接続に失敗しました。'; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP接続に失敗しました。';
$PHPMAILER_LANG['smtp_detail'] = '詳細: ';
$PHPMAILER_LANG['smtp_error'] = 'SMTPサーバーエラー: '; $PHPMAILER_LANG['smtp_error'] = 'SMTPサーバーエラー: ';
$PHPMAILER_LANG['variable_set'] = '変数が存在しません: '; $PHPMAILER_LANG['variable_set'] = '変数が存在しません: ';
$PHPMAILER_LANG['extension_missing'] = '拡張機能が見つかりません: ';
@@ -0,0 +1,27 @@
<?php
/**
* Kurdish (Sorani) PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
* @author Halo Salman <halo@home4t.com>
*/
$PHPMAILER_LANG['authenticate'] = 'هەڵەی SMTP : نەتوانرا کۆدەکە پشتڕاست بکرێتەوە ';
$PHPMAILER_LANG['connect_host'] = 'هەڵەی SMTP: نەتوانرا پەیوەندی بە سێرڤەرەوە بکات SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'هەڵەی SMTP: ئەو زانیاریانە قبوڵ نەکرا.';
$PHPMAILER_LANG['empty_message'] = 'پەیامەکە بەتاڵە';
$PHPMAILER_LANG['encoding'] = 'کۆدکردنی نەزانراو : ';
$PHPMAILER_LANG['execute'] = 'ناتوانرێت جێبەجێ بکرێت: ';
$PHPMAILER_LANG['file_access'] = 'ناتوانرێت دەستت بگات بە فایلەکە: ';
$PHPMAILER_LANG['file_open'] = 'هەڵەی پەڕگە(فایل): ناتوانرێت بکرێتەوە: ';
$PHPMAILER_LANG['from_failed'] = 'هەڵە لە ئاستی ناونیشانی نێرەر: ';
$PHPMAILER_LANG['instantiate'] = 'ناتوانرێت خزمەتگوزاری پۆستە پێشکەش بکرێت.';
$PHPMAILER_LANG['invalid_address'] = 'نەتوانرا بنێردرێت ، چونکە ناونیشانی ئیمەیڵەکە نادروستە: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' مەیلەر پشتگیری ناکات';
$PHPMAILER_LANG['provide_address'] = 'دەبێت ناونیشانی ئیمەیڵی لانیکەم یەک وەرگر دابین بکرێت.';
$PHPMAILER_LANG['recipients_failed'] = ' هەڵەی SMTP: ئەم هەڵانەی خوارەوەشکستی هێنا لە ناردن بۆ هەردووکیان: ';
$PHPMAILER_LANG['signing'] = 'هەڵەی واژۆ: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect()پەیوەندی شکستی هێنا .';
$PHPMAILER_LANG['smtp_error'] = 'هەڵەی ئاستی سێرڤەری SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'ناتوانرێت بیگۆڕیت یان دوبارە بینێریتەوە: ';
$PHPMAILER_LANG['extension_missing'] = 'درێژکراوە نەماوە: ';
@@ -5,24 +5,32 @@
* @package PHPMailer * @package PHPMailer
* @author Alexey Chumakov <alex@chumakov.ru> * @author Alexey Chumakov <alex@chumakov.ru>
* @author Foster Snowhill <i18n@forstwoof.ru> * @author Foster Snowhill <i18n@forstwoof.ru>
* @author ProjectSoft <projectsoft2009@yandex.ru>
*/ */
$PHPMAILER_LANG['authenticate'] = 'Ошибка SMTP: ошибка авторизации.'; $PHPMAILER_LANG['authenticate'] = 'Ошибка SMTP: не удалось пройти аутентификацию.';
$PHPMAILER_LANG['buggy_php'] = 'В вашей версии PHP есть ошибка, которая может привести к повреждению сообщений. Чтобы исправить, переключитесь на отправку по SMTP, отключите опцию mail.add_x_header в ваш php.ini, переключитесь на MacOS или Linux или обновите PHP до версии 7.0.17+ или 7.1.3+.';
$PHPMAILER_LANG['connect_host'] = 'Ошибка SMTP: не удается подключиться к SMTP-серверу.'; $PHPMAILER_LANG['connect_host'] = 'Ошибка SMTP: не удается подключиться к SMTP-серверу.';
$PHPMAILER_LANG['data_not_accepted'] = 'Ошибка SMTP: данные не приняты.'; $PHPMAILER_LANG['data_not_accepted'] = 'Ошибка SMTP: данные не приняты.';
$PHPMAILER_LANG['empty_message'] = 'Пустое сообщение';
$PHPMAILER_LANG['encoding'] = 'Неизвестная кодировка: '; $PHPMAILER_LANG['encoding'] = 'Неизвестная кодировка: ';
$PHPMAILER_LANG['execute'] = 'Невозможно выполнить команду: '; $PHPMAILER_LANG['execute'] = 'Невозможно выполнить команду: ';
$PHPMAILER_LANG['extension_missing'] = 'Расширение отсутствует: ';
$PHPMAILER_LANG['file_access'] = 'Нет доступа к файлу: '; $PHPMAILER_LANG['file_access'] = 'Нет доступа к файлу: ';
$PHPMAILER_LANG['file_open'] = 'Файловая ошибка: не удаётся открыть файл: '; $PHPMAILER_LANG['file_open'] = 'Файловая ошибка: не удаётся открыть файл: ';
$PHPMAILER_LANG['from_failed'] = 'Неверный адрес отправителя: '; $PHPMAILER_LANG['from_failed'] = 'Неверный адрес отправителя: ';
$PHPMAILER_LANG['instantiate'] = 'Невозможно запустить функцию mail().'; $PHPMAILER_LANG['instantiate'] = 'Невозможно запустить функцию mail().';
$PHPMAILER_LANG['provide_address'] = 'Пожалуйста, введите хотя бы один email-адрес получателя.';
$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.';
$PHPMAILER_LANG['recipients_failed'] = 'Ошибка SMTP: не удалась отправка таким адресатам: ';
$PHPMAILER_LANG['empty_message'] = 'Пустое сообщение';
$PHPMAILER_LANG['invalid_address'] = 'Не отправлено из-за неправильного формата email-адреса: '; $PHPMAILER_LANG['invalid_address'] = 'Не отправлено из-за неправильного формата email-адреса: ';
$PHPMAILER_LANG['invalid_header'] = 'Неверное имя или значение заголовка';
$PHPMAILER_LANG['invalid_hostentry'] = 'Неверная запись хоста: ';
$PHPMAILER_LANG['invalid_host'] = 'Неверный хост: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.';
$PHPMAILER_LANG['provide_address'] = 'Вы должны указать хотя бы один адрес электронной почты получателя.';
$PHPMAILER_LANG['recipients_failed'] = 'Ошибка SMTP: Ошибка следующих получателей: ';
$PHPMAILER_LANG['signing'] = 'Ошибка подписи: '; $PHPMAILER_LANG['signing'] = 'Ошибка подписи: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ошибка соединения с SMTP-сервером'; $PHPMAILER_LANG['smtp_code'] = 'Код SMTP: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'Дополнительная информация SMTP: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ошибка соединения с SMTP-сервером.';
$PHPMAILER_LANG['smtp_detail'] = 'Детали: ';
$PHPMAILER_LANG['smtp_error'] = 'Ошибка SMTP-сервера: '; $PHPMAILER_LANG['smtp_error'] = 'Ошибка SMTP-сервера: ';
$PHPMAILER_LANG['variable_set'] = 'Невозможно установить или сбросить переменную: '; $PHPMAILER_LANG['variable_set'] = 'Невозможно установить или сбросить переменную: ';
$PHPMAILER_LANG['extension_missing'] = 'Расширение отсутствует: ';
@@ -11,21 +11,28 @@
*/ */
$PHPMAILER_LANG['authenticate'] = 'SMTP Hatası: Oturum açılamadı.'; $PHPMAILER_LANG['authenticate'] = 'SMTP Hatası: Oturum açılamadı.';
$PHPMAILER_LANG['buggy_php'] = 'PHP sürümünüz iletilerin bozulmasına neden olabilecek bir hatadan etkileniyor. Bunu düzeltmek için, SMTP kullanarak göndermeye geçin, mail.add_x_header seçeneğini devre dışı bırakın php.ini dosyanızdaki mail.add_x_header seçeneğini devre dışı bırakın, MacOS veya Linux geçin veya PHP sürümünü 7.0.17+ veya 7.1.3+ sürümüne yükseltin,';
$PHPMAILER_LANG['connect_host'] = 'SMTP Hatası: SMTP sunucusuna bağlanılamadı.'; $PHPMAILER_LANG['connect_host'] = 'SMTP Hatası: SMTP sunucusuna bağlanılamadı.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Hatası: Veri kabul edilmedi.'; $PHPMAILER_LANG['data_not_accepted'] = 'SMTP Hatası: Veri kabul edilmedi.';
$PHPMAILER_LANG['empty_message'] = 'Mesajın içeriği boş'; $PHPMAILER_LANG['empty_message'] = 'Mesajın içeriği boş';
$PHPMAILER_LANG['encoding'] = 'Bilinmeyen karakter kodlama: '; $PHPMAILER_LANG['encoding'] = 'Bilinmeyen karakter kodlama: ';
$PHPMAILER_LANG['execute'] = 'Çalıştırılamadı: '; $PHPMAILER_LANG['execute'] = 'Çalıştırılamadı: ';
$PHPMAILER_LANG['extension_missing'] = 'Eklenti bulunamadı: ';
$PHPMAILER_LANG['file_access'] = 'Dosyaya erişilemedi: '; $PHPMAILER_LANG['file_access'] = 'Dosyaya erişilemedi: ';
$PHPMAILER_LANG['file_open'] = 'Dosya Hatası: Dosya açılamadı: '; $PHPMAILER_LANG['file_open'] = 'Dosya Hatası: Dosya açılamadı: ';
$PHPMAILER_LANG['from_failed'] = 'Belirtilen adreslere gönderme başarısız: '; $PHPMAILER_LANG['from_failed'] = 'Belirtilen adreslere gönderme başarısız: ';
$PHPMAILER_LANG['instantiate'] = 'Örnek e-posta fonksiyonu oluşturulamadı.'; $PHPMAILER_LANG['instantiate'] = 'Örnek e-posta fonksiyonu oluşturulamadı.';
$PHPMAILER_LANG['invalid_address'] = 'Geçersiz e-posta adresi: '; $PHPMAILER_LANG['invalid_address'] = 'Geçersiz e-posta adresi: ';
$PHPMAILER_LANG['invalid_header'] = 'Geçersiz başlık adı veya değeri: ';
$PHPMAILER_LANG['invalid_hostentry'] = 'Geçersiz ana bilgisayar girişi: ';
$PHPMAILER_LANG['invalid_host'] = 'Geçersiz ana bilgisayar: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' e-posta kütüphanesi desteklenmiyor.'; $PHPMAILER_LANG['mailer_not_supported'] = ' e-posta kütüphanesi desteklenmiyor.';
$PHPMAILER_LANG['provide_address'] = 'En az bir alıcı e-posta adresi belirtmelisiniz.'; $PHPMAILER_LANG['provide_address'] = 'En az bir alıcı e-posta adresi belirtmelisiniz.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Hatası: Belirtilen alıcılara ulaşılamadı: '; $PHPMAILER_LANG['recipients_failed'] = 'SMTP Hatası: Belirtilen alıcılara ulaşılamadı: ';
$PHPMAILER_LANG['signing'] = 'İmzalama hatası: '; $PHPMAILER_LANG['signing'] = 'İmzalama hatası: ';
$PHPMAILER_LANG['smtp_code'] = 'SMTP kodu: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'ek SMTP bilgileri: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP connect() fonksiyonu başarısız.'; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP connect() fonksiyonu başarısız.';
$PHPMAILER_LANG['smtp_detail'] = 'SMTP SMTP Detayı: ';
$PHPMAILER_LANG['smtp_error'] = 'SMTP sunucu hatası: '; $PHPMAILER_LANG['smtp_error'] = 'SMTP sunucu hatası: ';
$PHPMAILER_LANG['variable_set'] = 'Değişken ayarlanamadı ya da sıfırlanamadı: '; $PHPMAILER_LANG['variable_set'] = 'Değişken ayarlanamadı ya da sıfırlanamadı: ';
$PHPMAILER_LANG['extension_missing'] = 'Eklenti bulunamadı: ';
@@ -0,0 +1,30 @@
<?php
/**
* Urdu PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer
* @author Saqib Ali Siddiqui <saqibsra@gmail.com>
*/
$PHPMAILER_LANG['authenticate'] = 'SMTP خرابی: تصدیق کرنے سے قاصر۔';
$PHPMAILER_LANG['connect_host'] = 'SMTP خرابی: سرور سے منسلک ہونے سے قاصر۔';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP خرابی: ڈیٹا قبول نہیں کیا گیا۔';
$PHPMAILER_LANG['empty_message'] = 'پیغام کی باڈی خالی ہے۔';
$PHPMAILER_LANG['encoding'] = 'نامعلوم انکوڈنگ: ';
$PHPMAILER_LANG['execute'] = 'عمل کرنے کے قابل نہیں ';
$PHPMAILER_LANG['file_access'] = 'فائل تک رسائی سے قاصر:';
$PHPMAILER_LANG['file_open'] = 'فائل کی خرابی: فائل کو کھولنے سے قاصر:';
$PHPMAILER_LANG['from_failed'] = 'درج ذیل بھیجنے والے کا پتہ ناکام ہو گیا:';
$PHPMAILER_LANG['instantiate'] = 'میل فنکشن کی مثال بنانے سے قاصر۔';
$PHPMAILER_LANG['invalid_address'] = 'بھیجنے سے قاصر: غلط ای میل پتہ:';
$PHPMAILER_LANG['mailer_not_supported'] = ' میلر تعاون یافتہ نہیں ہے۔';
$PHPMAILER_LANG['provide_address'] = 'آپ کو کم از کم ایک منزل کا ای میل پتہ فراہم کرنا چاہیے۔';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP خرابی: درج ذیل پتہ پر نہیں بھیجا جاسکا: ';
$PHPMAILER_LANG['signing'] = 'دستخط کی خرابی: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP ملنا ناکام ہوا';
$PHPMAILER_LANG['smtp_error'] = 'SMTP سرور کی خرابی: ';
$PHPMAILER_LANG['variable_set'] = 'متغیر سیٹ نہیں کیا جا سکا: ';
$PHPMAILER_LANG['extension_missing'] = 'ایکٹینشن موجود نہیں ہے۔ ';
$PHPMAILER_LANG['smtp_code'] = 'SMTP سرور کوڈ: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'اضافی SMTP سرور کی معلومات:';
$PHPMAILER_LANG['invalid_header'] = 'غلط ہیڈر کا نام یا قدر';
+1 -1
View File
@@ -13,7 +13,7 @@
* @copyright 2012 - 2023 Marcus Bointon * @copyright 2012 - 2023 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
+1 -1
View File
@@ -13,7 +13,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
+2 -2
View File
@@ -13,7 +13,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
@@ -29,7 +29,7 @@ use League\OAuth2\Client\Token\AccessToken;
* OAuth - OAuth2 authentication wrapper class. * OAuth - OAuth2 authentication wrapper class.
* Uses the oauth2-client package from the League of Extraordinary Packages. * Uses the oauth2-client package from the League of Extraordinary Packages.
* *
* @see http://oauth2-client.thephpleague.com * @see https://oauth2-client.thephpleague.com
* *
* @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
*/ */
@@ -13,7 +13,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
+22 -26
View File
@@ -13,7 +13,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
@@ -152,8 +152,7 @@ class PHPMailer
* Only supported in simple alt or alt_inline message types * Only supported in simple alt or alt_inline message types
* To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator.
* *
* @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ * @see https://kigkonsult.se/iCalcreator/
* @see http://kigkonsult.se/iCalcreator/
* *
* @var string * @var string
*/ */
@@ -358,7 +357,7 @@ class PHPMailer
public $AuthType = ''; public $AuthType = '';
/** /**
* SMTP SMTPXClient command attibutes * SMTP SMTPXClient command attributes
* *
* @var array * @var array
*/ */
@@ -468,7 +467,7 @@ class PHPMailer
* Only applicable when sending via SMTP. * Only applicable when sending via SMTP.
* *
* @see https://en.wikipedia.org/wiki/Variable_envelope_return_path * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path
* @see http://www.postfix.org/VERP_README.html Postfix VERP info * @see https://www.postfix.org/VERP_README.html Postfix VERP info
* *
* @var bool * @var bool
*/ */
@@ -551,10 +550,10 @@ class PHPMailer
* The function that handles the result of the send email action. * The function that handles the result of the send email action.
* It is called out by send() for each email sent. * It is called out by send() for each email sent.
* *
* Value can be any php callable: http://www.php.net/is_callable * Value can be any php callable: https://www.php.net/is_callable
* *
* Parameters: * Parameters:
* bool $result result of the send action * bool $result result of the send action
* array $to email addresses of the recipients * array $to email addresses of the recipients
* array $cc cc email addresses * array $cc cc email addresses
* array $bcc bcc email addresses * array $bcc bcc email addresses
@@ -757,7 +756,7 @@ class PHPMailer
* *
* @var string * @var string
*/ */
const VERSION = '6.9.1'; const VERSION = '6.9.2';
/** /**
* Error severity: message only, continue processing. * Error severity: message only, continue processing.
@@ -903,7 +902,7 @@ class PHPMailer
} }
//Is this a PSR-3 logger? //Is this a PSR-3 logger?
if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) {
$this->Debugoutput->debug($str); $this->Debugoutput->debug(rtrim($str, "\r\n"));
return; return;
} }
@@ -1072,7 +1071,7 @@ class PHPMailer
* be modified after calling this function), addition of such addresses is delayed until send(). * be modified after calling this function), addition of such addresses is delayed until send().
* Addresses that have been added already return false, but do not throw exceptions. * Addresses that have been added already return false, but do not throw exceptions.
* *
* @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $kind One of 'to', 'cc', 'bcc', or 'Reply-To'
* @param string $address The email address * @param string $address The email address
* @param string $name An optional username associated with the address * @param string $name An optional username associated with the address
* *
@@ -1212,7 +1211,7 @@ class PHPMailer
* Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
* Note that quotes in the name part are removed. * Note that quotes in the name part are removed.
* *
* @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation * @see https://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
* *
* @param string $addrstr The address list string * @param string $addrstr The address list string
* @param bool $useimap Whether to use the IMAP extension to parse the list * @param bool $useimap Whether to use the IMAP extension to parse the list
@@ -1407,7 +1406,6 @@ class PHPMailer
* * IPv6 literals: 'first.last@[IPv6:a1::]' * * IPv6 literals: 'first.last@[IPv6:a1::]'
* Not all of these will necessarily work for sending! * Not all of these will necessarily work for sending!
* *
* @see http://squiloople.com/2009/12/20/email-address-validation/
* @copyright 2009-2010 Michael Rushton * @copyright 2009-2010 Michael Rushton
* Feel free to use and redistribute this code. But please keep this copyright notice. * Feel free to use and redistribute this code. But please keep this copyright notice.
*/ */
@@ -1734,9 +1732,8 @@ class PHPMailer
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
//A space after `-f` is optional, but there is a long history of its presence //A space after `-f` is optional, but there is a long history of its presence
//causing problems, so we don't use one //causing problems, so we don't use one
//Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Exim docs: https://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html
//Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Sendmail docs: https://www.sendmail.org/~ca/email/man/sendmail.html
//Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
//Example problem: https://www.drupal.org/node/1057954 //Example problem: https://www.drupal.org/node/1057954
//PHP 5.6 workaround //PHP 5.6 workaround
@@ -1901,7 +1898,7 @@ class PHPMailer
/** /**
* Send mail using the PHP mail() function. * Send mail using the PHP mail() function.
* *
* @see http://www.php.net/manual/en/book.mail.php * @see https://www.php.net/manual/en/book.mail.php
* *
* @param string $header The message headers * @param string $header The message headers
* @param string $body The message body * @param string $body The message body
@@ -1931,9 +1928,8 @@ class PHPMailer
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
//A space after `-f` is optional, but there is a long history of its presence //A space after `-f` is optional, but there is a long history of its presence
//causing problems, so we don't use one //causing problems, so we don't use one
//Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Exim docs: https://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html
//Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Sendmail docs: https://www.sendmail.org/~ca/email/man/sendmail.html
//Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
//Example problem: https://www.drupal.org/node/1057954 //Example problem: https://www.drupal.org/node/1057954
//CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
@@ -3634,7 +3630,7 @@ class PHPMailer
* without breaking lines within a character. * without breaking lines within a character.
* Adapted from a function by paravoid. * Adapted from a function by paravoid.
* *
* @see http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283 * @see https://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
* *
* @param string $str multi-byte text to wrap encode * @param string $str multi-byte text to wrap encode
* @param string $linebreak string to use as linefeed/end-of-line * @param string $linebreak string to use as linefeed/end-of-line
@@ -3690,7 +3686,7 @@ class PHPMailer
/** /**
* Encode a string using Q encoding. * Encode a string using Q encoding.
* *
* @see http://tools.ietf.org/html/rfc2047#section-4.2 * @see https://www.rfc-editor.org/rfc/rfc2047#section-4.2
* *
* @param string $str the text to encode * @param string $str the text to encode
* @param string $position Where the text is going to be used, see the RFC for what that means * @param string $position Where the text is going to be used, see the RFC for what that means
@@ -4228,7 +4224,7 @@ class PHPMailer
$result = $_SERVER['SERVER_NAME']; $result = $_SERVER['SERVER_NAME'];
} elseif (function_exists('gethostname') && gethostname() !== false) { } elseif (function_exists('gethostname') && gethostname() !== false) {
$result = gethostname(); $result = gethostname();
} elseif (php_uname('n') !== false) { } elseif (php_uname('n') !== '') {
$result = php_uname('n'); $result = php_uname('n');
} }
if (!static::isValidHost($result)) { if (!static::isValidHost($result)) {
@@ -4253,7 +4249,7 @@ class PHPMailer
empty($host) empty($host)
|| !is_string($host) || !is_string($host)
|| strlen($host) > 256 || strlen($host) > 256
|| !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+\])$/', $host) || !preg_match('/^([a-z\d.-]*|\[[a-f\d:]+\])$/i', $host)
) { ) {
return false; return false;
} }
@@ -4267,8 +4263,8 @@ class PHPMailer
//Is it a valid IPv4 address? //Is it a valid IPv4 address?
return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false; return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
} }
//Is it a syntactically valid hostname (when embeded in a URL)? //Is it a syntactically valid hostname (when embedded in a URL)?
return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false; return filter_var('https://' . $host, FILTER_VALIDATE_URL) !== false;
} }
/** /**
@@ -4679,7 +4675,7 @@ class PHPMailer
* Multi-byte-safe pathinfo replacement. * Multi-byte-safe pathinfo replacement.
* Drop-in replacement for pathinfo(), but multibyte- and cross-platform-safe. * Drop-in replacement for pathinfo(), but multibyte- and cross-platform-safe.
* *
* @see http://www.php.net/manual/en/function.pathinfo.php#107461 * @see https://www.php.net/manual/en/function.pathinfo.php#107461
* *
* @param string $path A filename or path, does not need to exist as a file * @param string $path A filename or path, does not need to exist as a file
* @param int|string $options Either a PATHINFO_* constant, * @param int|string $options Either a PATHINFO_* constant,
+5 -3
View File
@@ -13,7 +13,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
@@ -46,7 +46,7 @@ class POP3
* *
* @var string * @var string
*/ */
const VERSION = '6.9.1'; const VERSION = '6.9.2';
/** /**
* Default POP3 port number. * Default POP3 port number.
@@ -250,7 +250,9 @@ class POP3
//On Windows this will raise a PHP Warning error if the hostname doesn't exist. //On Windows this will raise a PHP Warning error if the hostname doesn't exist.
//Rather than suppress it with @fsockopen, capture it cleanly instead //Rather than suppress it with @fsockopen, capture it cleanly instead
set_error_handler([$this, 'catchWarning']); set_error_handler(function () {
call_user_func_array([$this, 'catchWarning'], func_get_args());
});
if (false === $port) { if (false === $port) {
$port = static::DEFAULT_PORT; $port = static::DEFAULT_PORT;
+28 -16
View File
@@ -13,7 +13,7 @@
* @copyright 2012 - 2020 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT * @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
@@ -35,7 +35,7 @@ class SMTP
* *
* @var string * @var string
*/ */
const VERSION = '6.9.1'; const VERSION = '6.9.2';
/** /**
* SMTP line break constant. * SMTP line break constant.
@@ -152,8 +152,8 @@ class SMTP
/** /**
* Whether to use VERP. * Whether to use VERP.
* *
* @see http://en.wikipedia.org/wiki/Variable_envelope_return_path * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path
* @see http://www.postfix.org/VERP_README.html Info on VERP * @see https://www.postfix.org/VERP_README.html Info on VERP
* *
* @var bool * @var bool
*/ */
@@ -164,7 +164,7 @@ class SMTP
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.
* This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
* *
* @see http://tools.ietf.org/html/rfc2821#section-4.5.3.2 * @see https://www.rfc-editor.org/rfc/rfc2821#section-4.5.3.2
* *
* @var int * @var int
*/ */
@@ -187,12 +187,12 @@ class SMTP
*/ */
protected $smtp_transaction_id_patterns = [ protected $smtp_transaction_id_patterns = [
'exim' => '/[\d]{3} OK id=(.*)/', 'exim' => '/[\d]{3} OK id=(.*)/',
'sendmail' => '/[\d]{3} 2.0.0 (.*) Message/', 'sendmail' => '/[\d]{3} 2\.0\.0 (.*) Message/',
'postfix' => '/[\d]{3} 2.0.0 Ok: queued as (.*)/', 'postfix' => '/[\d]{3} 2\.0\.0 Ok: queued as (.*)/',
'Microsoft_ESMTP' => '/[0-9]{3} 2.[\d].0 (.*)@(?:.*) Queued mail for delivery/', 'Microsoft_ESMTP' => '/[0-9]{3} 2\.[\d]\.0 (.*)@(?:.*) Queued mail for delivery/',
'Amazon_SES' => '/[\d]{3} Ok (.*)/', 'Amazon_SES' => '/[\d]{3} Ok (.*)/',
'SendGrid' => '/[\d]{3} Ok: queued as (.*)/', 'SendGrid' => '/[\d]{3} Ok: queued as (.*)/',
'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/', 'CampaignMonitor' => '/[\d]{3} 2\.0\.0 OK:([a-zA-Z\d]{48})/',
'Haraka' => '/[\d]{3} Message Queued \((.*)\)/', 'Haraka' => '/[\d]{3} Message Queued \((.*)\)/',
'ZoneMTA' => '/[\d]{3} Message queued as (.*)/', 'ZoneMTA' => '/[\d]{3} Message queued as (.*)/',
'Mailjet' => '/[\d]{3} OK queued as (.*)/', 'Mailjet' => '/[\d]{3} OK queued as (.*)/',
@@ -280,7 +280,8 @@ class SMTP
} }
//Is this a PSR-3 logger? //Is this a PSR-3 logger?
if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) {
$this->Debugoutput->debug($str); //Remove trailing line breaks potentially added by calls to SMTP::client_send()
$this->Debugoutput->debug(rtrim($str, "\r\n"));
return; return;
} }
@@ -293,6 +294,7 @@ class SMTP
switch ($this->Debugoutput) { switch ($this->Debugoutput) {
case 'error_log': case 'error_log':
//Don't output, just log //Don't output, just log
/** @noinspection ForgottenDebugOutputInspection */
error_log($str); error_log($str);
break; break;
case 'html': case 'html':
@@ -404,7 +406,9 @@ class SMTP
$errstr = ''; $errstr = '';
if ($streamok) { if ($streamok) {
$socket_context = stream_context_create($options); $socket_context = stream_context_create($options);
set_error_handler([$this, 'errorHandler']); set_error_handler(function () {
call_user_func_array([$this, 'errorHandler'], func_get_args());
});
$connection = stream_socket_client( $connection = stream_socket_client(
$host . ':' . $port, $host . ':' . $port,
$errno, $errno,
@@ -419,7 +423,9 @@ class SMTP
'Connection: stream_socket_client not available, falling back to fsockopen', 'Connection: stream_socket_client not available, falling back to fsockopen',
self::DEBUG_CONNECTION self::DEBUG_CONNECTION
); );
set_error_handler([$this, 'errorHandler']); set_error_handler(function () {
call_user_func_array([$this, 'errorHandler'], func_get_args());
});
$connection = fsockopen( $connection = fsockopen(
$host, $host,
$port, $port,
@@ -483,7 +489,9 @@ class SMTP
} }
//Begin encrypted connection //Begin encrypted connection
set_error_handler([$this, 'errorHandler']); set_error_handler(function () {
call_user_func_array([$this, 'errorHandler'], func_get_args());
});
$crypto_ok = stream_socket_enable_crypto( $crypto_ok = stream_socket_enable_crypto(
$this->smtp_conn, $this->smtp_conn,
true, true,
@@ -648,7 +656,7 @@ class SMTP
} }
//The following borrowed from //The following borrowed from
//http://php.net/manual/en/function.mhash.php#27225 //https://www.php.net/manual/en/function.mhash.php#27225
//RFC 2104 HMAC implementation for php. //RFC 2104 HMAC implementation for php.
//Creates an md5 HMAC. //Creates an md5 HMAC.
@@ -1162,7 +1170,9 @@ class SMTP
} else { } else {
$this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT); $this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT);
} }
set_error_handler([$this, 'errorHandler']); set_error_handler(function () {
call_user_func_array([$this, 'errorHandler'], func_get_args());
});
$result = fwrite($this->smtp_conn, $data); $result = fwrite($this->smtp_conn, $data);
restore_error_handler(); restore_error_handler();
@@ -1265,7 +1275,9 @@ class SMTP
while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
//Must pass vars in here as params are by reference //Must pass vars in here as params are by reference
//solution for signals inspired by https://github.com/symfony/symfony/pull/6540 //solution for signals inspired by https://github.com/symfony/symfony/pull/6540
set_error_handler([$this, 'errorHandler']); set_error_handler(function () {
call_user_func_array([$this, 'errorHandler'], func_get_args());
});
$n = stream_select($selR, $selW, $selW, $this->Timelimit); $n = stream_select($selR, $selW, $selW, $this->Timelimit);
restore_error_handler(); restore_error_handler();
+2 -2
View File
@@ -145,7 +145,7 @@ final class Idn
*/ */
public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = []) public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = [])
{ {
if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { if (self::INTL_IDNA_VARIANT_2003 === $variant) {
@trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); @trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED);
} }
@@ -198,7 +198,7 @@ final class Idn
*/ */
public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = []) public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = [])
{ {
if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { if (self::INTL_IDNA_VARIANT_2003 === $variant) {
@trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); @trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED);
} }
+2 -3
View File
@@ -20,9 +20,8 @@
} }
], ],
"require": { "require": {
"php": ">=7.1", "php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-intl-normalizer": "^1.10"
"symfony/polyfill-php72": "^1.10"
}, },
"autoload": { "autoload": {
"psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" },
+63 -14
View File
@@ -50,6 +50,9 @@ namespace Symfony\Polyfill\Mbstring;
* - mb_substr_count - Count the number of substring occurrences * - mb_substr_count - Count the number of substring occurrences
* - mb_ucfirst - Make a string's first character uppercase * - mb_ucfirst - Make a string's first character uppercase
* - mb_lcfirst - Make a string's first character lowercase * - mb_lcfirst - Make a string's first character lowercase
* - mb_trim - Strip whitespace (or other characters) from the beginning and end of a string
* - mb_ltrim - Strip whitespace (or other characters) from the beginning of a string
* - mb_rtrim - Strip whitespace (or other characters) from the end of a string
* *
* Not implemented: * Not implemented:
* - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
@@ -83,12 +86,6 @@ final class Mbstring
public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{ {
if (\is_array($s)) { if (\is_array($s)) {
if (PHP_VERSION_ID < 70200) {
trigger_error('mb_convert_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING);
return null;
}
$r = []; $r = [];
foreach ($s as $str) { foreach ($s as $str) {
$r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding); $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding);
@@ -427,12 +424,6 @@ final class Mbstring
public static function mb_check_encoding($var = null, $encoding = null) public static function mb_check_encoding($var = null, $encoding = null)
{ {
if (\PHP_VERSION_ID < 70200 && \is_array($var)) {
trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING);
return null;
}
if (null === $encoding) { if (null === $encoding) {
if (null === $var) { if (null === $var) {
return false; return false;
@@ -980,17 +971,75 @@ final class Mbstring
return $encoding; return $encoding;
} }
public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string
{
return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__);
}
public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string
{
return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__);
}
public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string
{
return self::mb_internal_trim('{[%s]+$}D', $string, $characters, $encoding, __FUNCTION__);
}
private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string
{
if (null === $encoding) {
$encoding = self::mb_internal_encoding();
} else {
self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given');
}
if ('' === $characters) {
return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding);
}
if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $string)) {
$string = @iconv('UTF-8', 'UTF-8//IGNORE', $string);
}
if (null !== $characters && !preg_match('//u', $characters)) {
$characters = @iconv('UTF-8', 'UTF-8//IGNORE', $characters);
}
} else {
$string = iconv($encoding, 'UTF-8//IGNORE', $string);
if (null !== $characters) {
$characters = iconv($encoding, 'UTF-8//IGNORE', $characters);
}
}
if (null === $characters) {
$characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}";
} else {
$characters = preg_quote($characters);
}
$string = preg_replace(sprintf($regex, $characters), '', $string);
if (null === $encoding) {
return $string;
}
return iconv('UTF-8', $encoding.'//IGNORE', $string);
}
private static function assertEncoding(string $encoding, string $errorFormat): void private static function assertEncoding(string $encoding, string $errorFormat): void
{ {
try { try {
$validEncoding = @self::mb_check_encoding('', $encoding); $validEncoding = @self::mb_check_encoding('', $encoding);
} catch (\ValueError $e) { } catch (\ValueError $e) {
throw new \ValueError(\sprintf($errorFormat, $encoding)); throw new \ValueError(sprintf($errorFormat, $encoding));
} }
// BC for PHP 7.3 and lower // BC for PHP 7.3 and lower
if (!$validEncoding) { if (!$validEncoding) {
throw new \ValueError(\sprintf($errorFormat, $encoding)); throw new \ValueError(sprintf($errorFormat, $encoding));
} }
} }
} }
+13
View File
@@ -144,6 +144,19 @@ if (!function_exists('mb_lcfirst')) {
function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
} }
if (!function_exists('mb_trim')) {
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); }
}
if (!function_exists('mb_ltrim')) {
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); }
}
if (!function_exists('mb_rtrim')) {
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); }
}
if (extension_loaded('mbstring')) { if (extension_loaded('mbstring')) {
return; return;
} }
+13 -1
View File
@@ -93,7 +93,7 @@ if (!function_exists('mb_strstr')) {
function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
} }
if (!function_exists('mb_get_info')) { if (!function_exists('mb_get_info')) {
function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); } function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); }
} }
if (!function_exists('mb_http_output')) { if (!function_exists('mb_http_output')) {
function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); }
@@ -140,6 +140,18 @@ if (!function_exists('mb_lcfirst')) {
function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
} }
if (!function_exists('mb_trim')) {
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); }
}
if (!function_exists('mb_ltrim')) {
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); }
}
if (!function_exists('mb_rtrim')) {
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); }
}
if (extension_loaded('mbstring')) { if (extension_loaded('mbstring')) {
return; return;
} }
+1 -1
View File
@@ -16,7 +16,7 @@
} }
], ],
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-mbstring": "*" "ext-mbstring": "*"
+8
View File
@@ -353,11 +353,18 @@ class Inline
++$i; ++$i;
// [foo, bar, ...] // [foo, bar, ...]
$lastToken = null;
while ($i < $len) { while ($i < $len) {
if (']' === $sequence[$i]) { if (']' === $sequence[$i]) {
return $output; return $output;
} }
if (',' === $sequence[$i] || ' ' === $sequence[$i]) { if (',' === $sequence[$i] || ' ' === $sequence[$i]) {
if (',' === $sequence[$i] && (null === $lastToken || 'separator' === $lastToken)) {
$output[] = null;
} elseif (',' === $sequence[$i]) {
$lastToken = 'separator';
}
++$i; ++$i;
continue; continue;
@@ -401,6 +408,7 @@ class Inline
$output[] = $value; $output[] = $value;
$lastToken = 'value';
++$i; ++$i;
} }