8000 Add experimental MimePgp component · symfony/symfony@118454c · GitHub
[go: up one dir, main page]

Skip to content

Commit 118454c

Browse files
committed
Add experimental MimePgp component
Introduce the new MimePgp component for encrypting MIME messages using OpenPGP. The component is marked as experimental and includes initial setup files, exceptions, tests, and a changelog.
1 parent 68944f5 commit 118454c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2187
-0
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
"symfony/mailer": "self.version",
9090
"symfony/messenger": "self.version",
9191
"symfony/mime": "self.version",
92+
"symfony/mime-pgp": "self.version",
9293
"symfony/monolog-bridge": "self.version",
9394
"symfony/notifier": "self.version",
9495
"symfony/options-resolver": "self.version",

pgp_test_key.asc

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
-----BEGIN PGP PRIVATE KEY BLOCK-----
2+
3+
lQdGBGRHn9gBEADC1Sd7pxVatAJv21dvpaGsmLhDLHWIffpLtnoZ7mJ/Y3Y4gyAb
4+
A5pZJs31qM2qnVud00Upq6EK4JKHis8neC8O7WSRZdqBZVfaEQUZKG0svoLmESZD
5+
yxszAV21eM/aIDatTumRTrqEfqIR8cGfoVEteihjewIjsYgSkTiVv0xtwiwZeLRL
6+
oeJvbwUolSEr5LkJE7PX1AsZ4omHK1vhVu2yUqIFsnCQHs9nnhLlDfsXLRRnChBD
7+
/DF4fwU76L6oCzoNNM6eTyNqu74BVR++dwkYg8eM6ZVQKw25dCbQgDi1XyZPDeB4
8+
VWBh4XQwRxBPKuAjhyjud6/tzzlINKCez61g4tNjZ7og6tnBtZVtSykkxp8Nbbby
9+
G/Oi9Jl4yUgwu/55ITEwbsXkkzeqhkaFG8Zr1xbq4Qn4k6N1dJWXs18RbDTAdrw8
10+
2iT19MErNnOsSPRG/xxoYjjw1YBW8jXWlt7eWg3aSejlrMXay86aqjJP5A3dq/cX
11+
cLsxpnewIgwn1sRQxZy+rq2vD60t6dhoL+p3HmQeViEbzOZhUhHEZ6QM8xOccxfD
12+
XIF1M9ohWdMBuPuBtvJZBOkVWSRA4UKJCFInJjEygBJ58gJh2aypPLU8JZ046MMa
13+
fCSwLszNIvZzHVDpYt4kllxfOF0DTEcLza1U4iJGYk9S8iIkA4CCOIWvTwARAQAB
14+
/gcDAmMtOOJArL2H9h1WXvTvagyWKMZlqATpTTh2OGShiQSWzpabmFAxaFthrzO6
15+
HYlBgGZvkhN47YhFYNpku7JLpAh7gO8BL1mXuR132wBd9SLYafX8IGqaN76Oj+3J
16+
vO0lxq9zJUS6cfDmMtKa0cnm1+acHyahw0ZnTbl6QpLbVesSraJLkDhl5LPUABzq
17+
zshdT2PAykPdwT2UXhORUR+/4ckvVT652pghKEk2ESFmOCeMkhny1lS+xm1WIC6b
18+
pFILp9llhUnrBGzVjAeMP9aMihcXMCOvvOvDmZX5e44/q78AgiTcdPH8BEDMPI2D
19+
qXYp0T2hn6ErQjp6swl2kQ6EL8yo6ZMJjwtKHrCMgk4B4emZ6YlwJahYYUE0Pz7T
20+
a3N4EWAjZUyJzdo30CsYoa6WJlvKrKY8Ise2xEomZJw4WA5VWavGrlRh4WIPzb7H
21+
FwZsnn47iAcQMikoZ68MTPNrtWhJuwJ2odiEgrjw5YWUo9e3kVG+OgRy99FJAsU+
22+
3GfKzU7L95Qtao+HxSkcHEYQ8Jhya1R4LUby1if55KpqeTLMO3bdQ8G+UuCvmUG7
23+
pYTZFpc5hhSmoGx9l1AlaZ6p5OBLH9vI4noM/wZ0Oxa/Ma9KL4VuTiS+hS6f+MAn
24+
oPK6s0EJgqniXhuyaWU0+fHhTrnhTwPRh0VbknoBW1/TOFB8u2qA2pvkZeARI9Fc
25+
zVhfSXOJsyoZJ4Nc4aP2ZzKfbG4OyaN+J1nmp4O1tPVHCfC9GyKw9zILx+XXflMk
26+
Ppz7md0Py2j6Mk9sCA36stxPfIiqX+hmJmJgo8CHp1Mv8ioLT2SqOlURJgaPAqpf
27+
sRhEmOYE6G6KhTxXeRLzUCKp5gd5YMq0X4cpeo1IK54XcsnpfjerMhILsBRUwKw6
28+
1uduGfrjAf0x2rc8gxuz2EJ8SWFORi0OHohAtQwMmXSExfu5bHtJtUoLnKd5HeQ4
29+
C+g4o4fzbnpJ6rHmf03UlElgAumc3iqp8TkQBW/zSH/Mh/Ka9EpXW1VbJjhqe08S
30+
6Q6imOxgLBkNJpaVyujZgMytTzz1gcSiPdMajFFkvnVzMuP3C4QJ4fb3RUcE5Fjr
31+
A12G1PSQmg91wOKuvnHEbL7Xs38Gny1Vrb2A8bvrUa/dUsrrTjqnOhN3ROVza9By
32+
G/M36D4tFvcNDvyo/z8jRAvK6F2pcuDhYvPpQB8Wc/SlYNKlUTtdIVF7pIWqHYac
33+
v0O0XTHxH8+5XcclwcGL9i7czR2W5Ofd+tkqlLHn0qaKLxmy3uLrhwP6oY9T7E2k
34+
hImBwRRHBhAbJg+78shkXVhYzFFVp2V6FWvVbodv5kSBx4pQMKmczCyB+gYdjP/a
35+
UfjVEgvQhM8nif4YbELwa3VDjEuZkZpOxwizsXvF87foXBONxSezFig5tfkCuLnD
36+
fkDI/JI1/dMGFGIQueXtqMSMQVQmMM7idVrNVWdtsFh6qzMZzgDVDo3qT6/qpVcb
37+
UYi1V8iUge2P+caS/SOulgS6GwZcfqQxkmxCqNlElzUoGeeUWanuUoW7hZY+PBKG
38+
VpwREk/6BJ1ourng1Weys+QGQ1nRqMd4uwYoqyxgLPRN1TzZicf5TGiKh6Noqn4n
39+
Is/OxCnoVXZ33H4ye+lnXFEmf/oHSNyuFseTKxq/3R4aE/yNafFg4uXwng7Cl5po
40+
P1+/fV01nbDWw/S1D35njsdBVGnwJtHjMxJ+pA+T5FsU2fd3rqBpr202gemkrzbr
41+
RYrHirhOV3AnEfoQPpXMPj6qKM9cUkmp7DIGchx1eZOzbBonUSkZJFa0FVB1TExp
42+
IDxwZ3BAcHVsbGkuZGV2PokCTgQTAQgAOBYhBN+0ZqiFcYEWen8K4zCvzh1oZEM+
43+
BQJkR5/YAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEDCvzh1oZEM+ZcUP
44+
/jB7iNrVaL/P9Cn6rrkXpgrPEoz6T0CpzkoKCnReNbmU5RZRxkssRa/3B2q24O4b
45+
afE2zOhAqK/XGkZ07O4ZREc7TBZruIMS9R1KtxIkggpepSoDtRxdwHpjLwjmRbQe
46+
fz8r509gN/0cenuFbzBoCEeoH3YOr0fPzZLM5kmdQNKWpPrymvnZOX4H0ll4BbhW
47+
IZNdDyH7ys4yDVYZH6sON2B6u4rhPqfHqDZNqyYi+05RigE7INE9q/QQyYnEma0j
48+
MvItx9Qzjhr+3qdNUsNIW6vr/b0eifcblOlt62l4gewDMSs9cmBSA3I5z7AirrMh
49+
R92h6cDaJ+TjvnbhZfMT1AgR71iXm6wgpW2gatdxoDmWTDEIclOVTkXu4rbOABGb
50+
Qo1vDnTzNfem74uHTwrWiwY59DT5LbJQRujWHeAykBbw/Ot/tcypYdtsnnBuSx8T
51+
EeJ502k7OzjQxX0oD0q2QMGJx/2VUaD98WtIkck8+tZ8uT9H2WOwaEgRcOEU2+zq
52+
wnmJQWcIzGyv0KthKToOkIS1xMDaH6IG+8l8J4jAexS8O995Syt7GspVVLNtT+po
53+
rGP7vN6sakm5QfNjGLOTvVQwH1dLWWUS/4XjXv6I9W+ivrzduLi9hZDu8jDOvtzA
54+
TX4KYQgOEfBcKosbHnjSOCicJead/mImZJwuSwiN8NX4nQdGBGRHn9gBEADS5QST
55+
B5OXgks4j/vn3QYJi5nsgRnGJaYd6/oXgu9pOY18it/He8Kh4jyzcINN+8+x5fXQ
56+
bdga1D1TbwRd29TQxB810MeXc9Q8D/tSE7J4f9M6Y4S2C//qw9tOgS8/lc1JY1ij
57+
hjHY6vcThZDpJwmHJFAfTMuBNVJEWvvbPoIjvsH22wwW4EEAI0NpznFByk6KRCj8
58+
17UIRZTAds57op8Me7gCkBwG9QASRYI0Pk6Ds1N89oWh9Txst+nD8Pqke85xCCsv
59+
f1zMf+I7V9zMBQ+cM8ISv9pVGaLQuUDzq66PklTsV09SUWB3ieC+U1pRL5FXnq+s
60+
uHvPpEVr9Hnb9ebaoy6kdNS8L7Aur8aiZigGtH6HlaZmuvZvlwooH5gpMcC2h82a
61+
lECax4lGjDu0JlGRhJUKPCGygE3fZeHY9jMq9BJ/BKWuN1cedAt/+40qtYaaWxJa
62+
CdF8WCJc1+Lep4U0kSR4sO66fmmLEyg2+p17Dtk4TG61QL/orjWzYpRnSYdMPcU+
63+
B5MFVj80Meri3rwK++zvuC73vPEAnVjSWCBVPJvfhYA7nlD60Yxbms1s+lt/tKaw
64+
3auzpPgGzd4PVNHUCOKKkECTBP4MksCSeo+X2jASvotblprd/HV1iPkF4AoZQg0+
65+
PmTlfZQUPSCXpvGCG/mJywvuneQTSqurqGOdKwARAQAB/gcDAhj94v5bcXia9ld4
66+
phvrEjv2n2KGYMzgjORdJQQDtMJb31+6n57wp4FGAsJOqVOefhkRg5eOC7kXYkUd
67+
n76MW8E5R9sv09AYAB3U6/hEk5aziQcOQ1sLr/wND1gG7iEGfxAMxuXFcMsVOwxA
68+
Ex9WoaklZGV2v8szCavy/ImzYcMlovXLVhCQfiodJqTfCkJOnYloa7Dxyuu2cGS3
69+
xsKaNg0FMjWAK/yivn0b36Xj7lYYGhjQN9yVJeOUeyifdUKClaGgRRn3XdWemKfQ
70+
HtfL7P/ftx/iZ/y8jcYAs8ajdHcboY8X8GWoL1HEMHXJUVTEX0ZTDJb+2RERPDRN
71+
Naz9EYLLgRxcwt9uriaVdjWRllWfHLWsng8QLtKPtnB0AelUz8F9XGnqCjj1Dz8N
72+
F1wY5Af6QL1o/H4oi6CJN5FFdaHPbfKCosRh3iicR8abEx24FkSnD69kSG5SQfAd
73+
cO2a8s4FFJHsOO7AtP/ebUS2SRGWlk9kG1g0fEtGwhjaM9OHWKbZHVBRymu/Irmx
74+
BdzqAcNZLmvOGDzfI6jOzMBJkgVpYB6DaX/VnZ76uY5Ow08WyNEga03HW5MIeee5
75+
fp7kkECQQhMz6GIgUyabmsbAI8r8R5N7s98LEK4g+9IzwkP64+yGVAsMa+SjpZSH
76+
lLC4biVClkx6xOFQWHUP6xjJEtrBl3DT1/6cu+dq4x/o8libLGdbbyKv7/izvPJl
77+
nEVEAEjOdq6rZNKtn00lXy90EsRL/ZkvP7cclpLxeGIaH+dm6Jq1z5QTBBeDjZKi
78+
xZriU7DBThIgU/Hpcvo2FDmIBX0jsZDkPZ63ZXp+kHrFw+Umz35dT9z18kybXtsR
79+
H4yeiztILHzXnLMxQ3hGRVT7wkpbfAVd9J99tKdJqfuOWbYVUJU8oWepAReTsG74
80+
zQcCYU7Ps8LJImMYeWirshSym54IPk5Klh3nE/9RzQCakaNPR0T6euu5TbzINti3
81+
CEs1/+lE8CoZKhp+sHbk3RzbeVLZnZncD/PO+cxs604yBANKTOWxx1jSSFSVO0JI
82+
U5loXEReq+yiV/5alzrJE2tJ5wR/oL0mET4bvAlBlGUL0YD4RKrkDjIB8/rnPYQr
83+
+8jgEPdUufUi0E6z5jjjMXHfggYsDwXQ8dnlp8ro8aoqV12l+rqcBDABoMadl9LG
84+
tirwUFMi5C5G1fGiGT7frbv+lyROE7TPzn28vPkuIe1S/fdeTOJU8kmvi145R9rs
85+
ldyn9f1LsQUuIl70PebQh1fLdNV13UOqFD+Sb3tikd69/f+4WWxKzgIFL0FxM+jr
86+
bjQ8IXad+DypJoQIrRXm9zDgomajqDHwznB7NmK7JlLoUPp8t+W0Is1+BymbcDmX
87+
83+osPtTDwN3h8YerN+eXTL5PX5LCKmjbhnsBl3WBto/2p8EJJCDm3D6AiDC1fum
88+
SvlpsMVKgca3Kz1E3tyAcex/q+KhvGEh6gL+otOa/MEYpL6S/JqDlRH+2Az6tRJQ
89+
v+bC89/B7P70pnOlOsbx//2A5ZO6AcWkjlac6WoNjPXazU9y88cMX3PrFSSbGYM8
90+
zIUeqJbs4qE2hMO8mp5d/yWoAHrELkuOLtMqwTj//moJ5xkhzH/xJGRwkuUaLXaV
91+
k5W+iLirSd6/brZ0un7LUyMK+NGo3E6ag8IYFRB1ERzJsN0ZqMc9fpsCq4ABkTYi
92+
Gg55tbaM4JpizW0KmtOU6SFZGIU1vK8jBvJPMOA2KsOdYZocMxODdt5fW5wrxpPC
93+
EmT0NXy7SS/EL3W2abnbnzEkXwXo79UW/NOJAjYEGAEIACAWIQTftGaohXGBFnp/
94+
CuMwr84daGRDPgUCZEef2AIbDAAKCRAwr84daGRDPotiD/wKxLv6+YV/b04jYgET
95+
wBNCQs30Oo9xs7pzT+AOSlNER+DvWQTaU5rsBNJo10K7B5gmnQU6DJ7dAaiv8uQk
96+
rXJLUh2DHOGB0D6w8QfNd8CPoiMq7+PC6zFHvxXrRzdUE0iMV8zXap3YkvwATzKL
97+
YwSKTr+7mzotYb0So0Jm4rmElHelj0VZmAicN9fdIAUYlmCZgnAGLlLbiwi7k/F4
98+
LjYVAfzi0lGjs78cAiAjQqsX8MZ91xbgz8C4f6qp4zhYfpIuqY92NpzsO/eYia08
99+
wwkirkS5mnG3M9WjwQYxl5qPxuvNfYxapOgYdSqKL7UYq10zV3D7enln/yOVOLfD
100+
fqnxD/RjeNmyJj8QxTKP04fFyuOR2c/EHUsNxYLy7oPx6gYEBcDFvSmr2YgwO77w
101+
UVkByji6BEZd4OcbqoCcGUTJh3pdJv7Iy1AevAX6UqqJ7Bg0pKwrFbKLvJ8x5bTd
102+
xpD7NvfjmwinZ+AnSvK/8e3gzMNaACUZxid6Zpco0M9lNJX2ElMRt2VlLXPl+O+k
103+
AmlDYQAwV5mdEMCTzoOosziRPuO4eTBk3X7F2dlOOaG2GksllgrbSOhopfFOAMy3
104+
5+cjkYU0YL27uXUsER9JRCDjzqUuSRmHJm0pfwnyee/6pCHXEEfAkxbOc5L9Wo+X
105+
cvLFBoHiJ0sMhrEfncqtBJnOCw==
106+
=cAza
107+
-----END PGP PRIVATE KEY BLOCK-----
108+
-----BEGIN PGP PUBLIC KEY BLOCK-----
109+
110+
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
157+
=w8wH
158+
-----END PGP PUBLIC KEY BLOCK-----

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2343,6 +2343,34 @@ private function addMailerSection(ArrayNodeDefinition $rootNode, callable $enabl
23432343
->end()
23442344
->end()
23452345
->end()
2346+
->arrayNode('pgp_signer')
2347+
->addDefaultsIfNotSet()
2348+
->canBeEnabled()
2349+
->info('PGP/MIME signer configuration')
2350+
->children()
2351+
->scalarNode('secret_key')
2352+
->info('Path to the secret key (ASCII armored format without the `file://` prefix)')
2353+
->defaultValue('')
2354+
->cannotBeEmpty()
2355+
->end()
2356+
->scalarNode('public_key')
2357+
->info('Path to the public key (ASCII armored format without the `file://` prefix)')
2358+
->defaultNull('')
2359+
->end()
2360+
->scalarNode('passphrase')
2361+
->info('The secret key passphrase')
2362+
->defaultNull()
2363+
->end()
2364+
->scalarNode('binary')
2365+
->info('Path to the GnuPG binary')
2366+
->defaultValue('gpg')
2367+
->end()
2368+
->scalarNode('digest_algorithm')
2369+
->info('The digest algorithm')
2370+
->defaultValue('SHA512')
2371+
->end()
2372+
->end()
2373+
->end()
23462374
->end()
23472375
->end()
23482376
->end()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
use Symfony\Component\Mailer\Command\MailerTestCommand;
114114
use Symfony\Component\Mailer\EventListener\DkimSignedMessageListener;
115115
use Symfony\Component\Mailer\EventListener\MessengerTransportListener;
116+
use Symfony\Component\Mailer\EventListener\PgpSignedMessageListener;
116117
use Symfony\Component\Mailer\EventListener\SmimeEncryptedMessageListener;
117118
use Symfony\Component\Mailer\EventListener\SmimeSignedMessageListener;
118119
use Symfony\Component\Mailer\Mailer;
@@ -2901,6 +2902,23 @@ private function registerMailerConfiguration(array $config, ContainerBuilder $co
29012902
$container->removeDefinition('mailer.smime_encrypter.listener');
29022903
}
29032904

2905+
if ($config['pgp_signer']['enabled']) {
2906+
if (!class_exists(PgpSignedMessageListener::class)) {
2907+
throw new LogicException('PGP/MIME signed messages support cannot be enabled as this version of the Mailer component does not support it.');
2908+
}
2909+
$smimeSigner = $container->getDefinition('mailer.pgp_signer');
2910+
$smimeSigner->setArgument(0, $config['pgp_signer']['secret_key']);
2911+
$smimeSigner->setArgument(1, $config['pgp_signer']['public_key']);
2912+
$smimeSigner->setArgument(2, $config['pgp_signer']['passphrase']);
2913+
$smimeSigner->setArgument(3, [
2914+
'binary' => $config['pgp_signer']['binary'],
2915+
'digest_algorithm' => $config['pgp_signer']['digest_algorithm'],
2916+
]);
2917+
} else {
2918+
$container->removeDefinition('mailer.pgp_signer');
2919+
$container->removeDefinition('mailer.pgp_signer.listener');
2920+
}
2921+
29042922
if ($webhookEnabled) {
29052923
$loader->load('mailer_webhook.php');
29062924
}

src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\Mailer\EventListener\MessageListener;
1818
use Symfony\Component\Mailer\EventListener\MessageLoggerListener;
1919
use Symfony\Component\Mailer\EventListener\MessengerTransportListener;
20+
use Symfony\Component\Mailer\EventListener\PgpSignedMessageListener;
2021
use Symfony\Component\Mailer\EventListener\SmimeEncryptedMessageListener;
2122
use Symfony\Component\Mailer\EventListener\SmimeSignedMessageListener;
2223
use Symfony\Component\Mailer\Mailer;
@@ -28,6 +29,7 @@
2829
use Symfony\Component\Mime\Crypto\DkimSigner;
2930
use Symfony\Component\Mime\Crypto\SMimeEncrypter;
3031
use Symfony\Component\Mime\Crypto\SMimeSigner;
32+
use Symfony\Component\MimePgp\PgpSigner;
3133

3234
return static function (ContainerConfigurator $container) {
3335
$container->services()
@@ -126,6 +128,20 @@
126128
])
127129
->tag('kernel.event_subscriber')
128130

131+
->set('mailer.pgp_signer', PgpSigner::class)
132+
->args([
133+
abstract_arg('secret_key'),
134+
abstract_arg('public_key'),
135+
abstract_arg('passphrase'),
136+
abstract_arg('options'),
137+
])
138+
139+
->set('mailer.pgp_signer.listener', PgpSignedMessageListener::class)
140+
->args([
141+
service('mailer.pgp_signer'),
142+
])
143+
->tag('kernel.event_subscriber')
144+
129145
->set('console.command.mailer_test', MailerTestCommand::class)
130146
->args([
131147
service('mailer.transports'),

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@
794794
<xsd:element name="dkim-signer" type="mailer_dkim_signer" minOccurs="0" />
795795
<xsd:element name="smime-signer" type="mailer_smime_signer" minOccurs="0" />
796796
<xsd:element name="smime-encrypter" type="mailer_smime_encrypter" minOccurs="0" />
797+
<xsd:element name="pgp-signer" type="mailer_pgp_signer" minOccurs="0" />
797798
</xsd:sequence>
798799
<xsd:attribute name="enabled" type="xsd:boolean" />
799800
<xsd:attribute name="dsn" type="xsd:string" />
@@ -840,6 +841,14 @@
840841
<xsd:attribute name="cipher" type="xsd:integer" />
841842
</xsd:complexType>
842843

844+
<xsd:complexType name="mailer_pgp_signer">
845+
<xsd:attribute name="secret_key" type="xsd:string"/>
846+
<xsd:attribute name="public_key" type="xsd:string"/>
847+
<xsd:attribute name="passphrase" type="xsd:string" />
848+
<xsd:attribute name="binary" type="xsd:string" />
849+
<xsd:attribute name="digest_algorithm" type="xsd:integer" />
850+
</xsd:complexType>
851+
843852
<xsd:complexType name="http_cache">
844853
<xsd:sequence>
845854
<xsd:element name="private-header" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,14 @@ class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphor
944944
'certificate' => '',
945945
'cipher' => null,
946946
],
947+
'pgp_signer' => [
948+
'enabled' => false,
949+
'secret_key' => '',
950+
'public_key' => null,
951+
'passphrase' => null,
952+
'binary' => 'gpg',
953+
'digest_algorithm' => 'SHA512',
954+
],
947955
],
948956
'notifier' => [
949957
'enabled' => !class_exists(FullStack::class) && class_exists(Notifier::class),

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"symfony/mailer": "^6.4|^7.0",
5454
"symfony/messenger": "^6.4|^7.0",
5555
"symfony/mime": "^6.4|^7.0",
56+
"symfony/mime-pgp": "^7.3",
5657
"symfony/notifier": "^6.4|^7.0",
5758
"symfony/process": "^6.4|^7.0",
5859
"symfony/rate-limiter": "^6.4|^7.0",

src/Symfony/Component/Mailer/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ CHANGELOG
99
* Add DSN param `source_ip` to allow binding to a (specific) IPv4 or IPv6 address.
1010
* Add DSN param `require_tls` to enforce use of TLS/STARTTLS
1111
* Add `DkimSignedMessageListener`, `SmimeEncryptedMessageListener`, and `SmimeSignedMessageListener`
12+
* Add `PgpSignedMessageListener`
1213

1314
7.2
1415
---
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\EventListener;
13+
14+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\Mailer\Event\MessageEvent;
16+
use Symfony\Component\Mime\Message;
17+
use Symfony\Component\MimePgp\PgpSigner;
18+
19+
/**
20+
* Signs messages using PGP/MIME.
21+
*
22+
* @author Florent Morselli
23+
*/
24+
class PgpSignedMessageListener implements EventSubscriberInterface
25+
{
26+
public function __construct(
27+
private PgpSigner $signer,
28+
) {
29+
}
30+
31+
public function onMessage(MessageEvent $event): void
32+
{
33+
$message = $event->getMessage();
34+
if (!$message instanceof Message) {
35+
return;
36+
}
37+
38+
$event->setMessage($this->signer->sign($message));
39+
}
40+
41+
public static function getSubscribedEvents(): array
42+
{
43+
return [
44+
MessageEvent::class => ['onMessage', -128],
45+
];
46+
}
47+
}

0 commit comments

Comments
 (0)
0