public inbox for pmg-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pmg-devel] [PATCH pmg-api 0/3] adds plain-text variants for both reports
@ 2025-09-18 10:30 Hannes Laimer
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports Hannes Laimer
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Hannes Laimer @ 2025-09-18 10:30 UTC (permalink / raw)
  To: pmg-devel

This addresses both #1621 and #4023. The plain-text parts are a little
"spacey", but overall I think the formatting is fine.

https://bugzilla.proxmox.com/show_bug.cgi?id=4023
https://bugzilla.proxmox.com/show_bug.cgi?id=1621

Hannes Laimer (3):
  pmgqm: add plain subject/from fields for reports
  fix #1621: templates: add plain-text variant of short/verbose spam
    report
  fix #4023: templates: add plain-text variant of admin report

 src/Makefile                              |  3 ++
 src/PMG/CLI/pmgqm.pm                      | 17 ++++++--
 src/templates/pmgreport.plain.tt          | 51 +++++++++++++++++++++++
 src/templates/spamreport-short.plain.tt   | 21 ++++++++++
 src/templates/spamreport-verbose.plain.tt | 25 +++++++++++
 5 files changed, 113 insertions(+), 4 deletions(-)
 create mode 100644 src/templates/pmgreport.plain.tt
 create mode 100644 src/templates/spamreport-short.plain.tt
 create mode 100644 src/templates/spamreport-verbose.plain.tt

-- 
2.47.3



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports
  2025-09-18 10:30 [pmg-devel] [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
@ 2025-09-18 10:30 ` Hannes Laimer
  2025-09-18 13:21   ` Thomas Lamprecht
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 2/3] fix #1621: templates: add plain-text variant of short/verbose spam report Hannes Laimer
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Hannes Laimer @ 2025-09-18 10:30 UTC (permalink / raw)
  To: pmg-devel

We don't want plain-text reports to contain HTML-escaped chars,
this skips html encoding for the plain-text part.

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
 src/PMG/CLI/pmgqm.pm | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/PMG/CLI/pmgqm.pm b/src/PMG/CLI/pmgqm.pm
index 41f9f1a..acac284 100755
--- a/src/PMG/CLI/pmgqm.pm
+++ b/src/PMG/CLI/pmgqm.pm
@@ -45,17 +45,26 @@ sub get_item_data {
 
     $item->{id} = sprintf("C%dR%dT%d", $ref->{cid}, $ref->{rid}, $ref->{ticketid});
 
-    $item->{subject} =
-        PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('subject')) || 'No Subject');
+    my $raw_subject = PVE::Tools::trim($head->get('subject')) || 'No Subject';
+    $item->{subject} = PMG::Utils::rfc1522_to_html($raw_subject);
+    $item->{subject_plain} = PMG::Utils::decode_rfc1522($raw_subject);
 
-    my $from = PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('from') // $ref->{sender}));
-    my $sender = PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('sender')));
+    my $raw_from = PVE::Tools::trim($head->get('from') // $ref->{sender});
+    my $raw_sender = PVE::Tools::trim($head->get('sender'));
+
+    my $from = PMG::Utils::rfc1522_to_html($raw_from);
+    my $sender = PMG::Utils::rfc1522_to_html($raw_sender);
+
+    my $from_plain = PMG::Utils::decode_rfc1522($raw_from);
+    my $sender_plain = PMG::Utils::decode_rfc1522($raw_sender);
 
     if ($sender) {
         $item->{sender} = $sender;
         $item->{from} = sprintf("%s on behalf of %s", $sender, $from);
+        $item->{from_plain} = sprintf("%s on behalf of %s", $sender_plain, $from_plain);
     } else {
         $item->{from} = $from;
+        $item->{from_plain} = $from_plain;
     }
 
     $item->{envelope_sender} = $ref->{sender};
-- 
2.47.3



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pmg-devel] [PATCH pmg-api 2/3] fix #1621: templates: add plain-text variant of short/verbose spam report
  2025-09-18 10:30 [pmg-devel] [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports Hannes Laimer
@ 2025-09-18 10:30 ` Hannes Laimer
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 3/3] fix #4023: templates: add plain-text variant of admin report Hannes Laimer
  2025-09-18 14:33 ` [pmg-devel] superseded: [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
  3 siblings, 0 replies; 7+ messages in thread
From: Hannes Laimer @ 2025-09-18 10:30 UTC (permalink / raw)
  To: pmg-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
 src/Makefile                              |  2 ++
 src/templates/spamreport-short.plain.tt   | 21 +++++++++++++++++++
 src/templates/spamreport-verbose.plain.tt | 25 +++++++++++++++++++++++
 3 files changed, 48 insertions(+)
 create mode 100644 src/templates/spamreport-short.plain.tt
 create mode 100644 src/templates/spamreport-verbose.plain.tt

diff --git a/src/Makefile b/src/Makefile
index 896319b..b75c818 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -27,7 +27,9 @@ TEMPLATES =				\
 	fetchmailrc.tt			\
 	pmgreport.tt			\
 	spamreport-verbose.tt		\
+	spamreport-verbose.plain.tt	\
 	spamreport-short.tt		\
+	spamreport-short.plain.tt	\
 	main.cf.in			\
 	main.cf.in.demo			\
 	master.cf.in			\
diff --git a/src/templates/spamreport-short.plain.tt b/src/templates/spamreport-short.plain.tt
new file mode 100644
index 0000000..b79ee04
--- /dev/null
+++ b/src/templates/spamreport-short.plain.tt
@@ -0,0 +1,21 @@
+[% IF timespan == 'week' -%]
+[% SET title = "Weekly Spam Report for '${pmail}' - ${date}'" -%]
+[% ELSIF timespan.substr(timespan.length - 1) == 'h' -%]
+[% SET title = "Spam Report (last ${timespan}) for '${pmail}' - ${date}" -%]
+[% ELSE -%]
+[% SET title = "Daily Spam Report for '${pmail}' - ${date}" -%]
+[% END -%]
+
+subject: [% title %]
+
+You received [% mailcount %] spam mail(s).
+
+[% SET links = [] %]
+Manage your spam quarantine: [% n = links.size + 1; links.push(managehref); %][[% n %]]
+Powered by Proxmox: [% n = links.size + 1; links.push('http://www.proxmox.com'); %][[% n %]]
+
+Links:
+[% FOREACH l IN links %][% loop.index + 1 %]: [% l %]
+[% END %]
+
+
diff --git a/src/templates/spamreport-verbose.plain.tt b/src/templates/spamreport-verbose.plain.tt
new file mode 100644
index 0000000..641eb03
--- /dev/null
+++ b/src/templates/spamreport-verbose.plain.tt
@@ -0,0 +1,25 @@
+[%- IF timespan == 'week' -%]
+[%- SET title = "Weekly Spam Report for '${pmail}' - ${date}'" -%]
+[%- ELSIF timespan.substr(timespan.length - 1) == 'h' -%]
+[%- SET title = "Spam Report (last ${timespan}) for '${pmail}' - ${date}" -%]
+[%- ELSE -%]
+[%- SET title = "Daily Spam Report for '${pmail}' - ${date}" -%]
+[%- END -%]
+subject: [% title %]
+[% SET links = [] -%]
+[% IF items.size -%]
+Spam quarantine entries for [% pmail %]:
+
+[% FOREACH item IN items %]
+- [% item.date %] [% item.time %] From: [% item.from_plain %]
+  Subject: [% item.subject_plain %] [% n = links.size + 1; links.push(item.href); %][[% n %]]
+
+[% END %]
+[% ELSE %]
+No spam entries for the selected period.
+[% END %]
+Manage your spam quarantine: [% n = links.size + 1; links.push(managehref); %][[% n %]]
+Powered by Proxmox: [% n = links.size + 1; links.push('http://www.proxmox.com'); %][[% n %]]
+Links:
+[% FOREACH l IN links %][% loop.index + 1 %]: [% l %]
+[% END %]
-- 
2.47.3



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pmg-devel] [PATCH pmg-api 3/3] fix #4023: templates: add plain-text variant of admin report
  2025-09-18 10:30 [pmg-devel] [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports Hannes Laimer
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 2/3] fix #1621: templates: add plain-text variant of short/verbose spam report Hannes Laimer
@ 2025-09-18 10:30 ` Hannes Laimer
  2025-09-18 14:33 ` [pmg-devel] superseded: [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
  3 siblings, 0 replies; 7+ messages in thread
From: Hannes Laimer @ 2025-09-18 10:30 UTC (permalink / raw)
  To: pmg-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
 src/Makefile                     |  1 +
 src/templates/pmgreport.plain.tt | 51 ++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 src/templates/pmgreport.plain.tt

diff --git a/src/Makefile b/src/Makefile
index b75c818..2c5ef28 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -26,6 +26,7 @@ CONF_MANS= pmg.conf.5 cluster.conf.5
 TEMPLATES =				\
 	fetchmailrc.tt			\
 	pmgreport.tt			\
+	pmgreport.plain.tt		\
 	spamreport-verbose.tt		\
 	spamreport-verbose.plain.tt	\
 	spamreport-short.tt		\
diff --git a/src/templates/pmgreport.plain.tt b/src/templates/pmgreport.plain.tt
new file mode 100644
index 0000000..a46d20e
--- /dev/null
+++ b/src/templates/pmgreport.plain.tt
@@ -0,0 +1,51 @@
+subject: Proxmox Status Report - [% date %] ([% fqdn %])
+[% IF cluster -%]
+Cluster Status
+[% FOREACH item IN cluster -%]
+- Hostname: [% item.hostname %]
+  IP Address: [% item.ip %]
+  Role: [% item.type %]
+  State: [% item.state %]
+  Load: [% item.loadavg1 %]
+  Memory: [% item.memory %]
+  Disk: [% item.disk %]
+[% IF !loop.last %]----
+[% END %]
+[% END %]
+[% END %]
+[% IF system -%]
+System Status
+[% FOREACH item IN system -%]
+- [% item.text %]: [% item.value %]
+[% END %]
+[% END %]
+[% IF incoming -%]
+Incoming Mails (24 hours)
+[% FOREACH item IN incoming -%]
+- [% item.text %][% IF item.percentage.defined %] ([% item.percentage %]%)[% END %]: [% item.value %]
+[% END %]
+[% END %]
+[% IF outgoing -%]
+Outgoing Mails (24 hours)
+[% FOREACH item IN outgoing -%]
+- [% item.text %][% IF item.percentage.defined %] ([% item.percentage %]%)[% END %]: [% item.value %]
+[% END %]
+[% END %]
+[% IF virusstat -%]
+Virus Charts (Top 10)
+[% FOREACH item IN virusstat -%]
+- [% item.name %]: [% item.count %]
+[% END %]
+[% END %]
+[% IF virusquar -%]
+Virus Quarantine
+[% FOREACH item IN virusquar -%]
+- [% item.text %]: [% item.value %]
+[% END %]
+[% END %]
+[% IF spamquar -%]
+Spam Quarantine
+[% FOREACH item IN spamquar -%]
+- [% item.text %]: [% item.value %]
+[% END %]
+[% END %]
-- 
2.47.3



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports Hannes Laimer
@ 2025-09-18 13:21   ` Thomas Lamprecht
  2025-09-18 14:08     ` Hannes Laimer
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Lamprecht @ 2025-09-18 13:21 UTC (permalink / raw)
  To: Hannes Laimer, pmg-devel

Am 18.09.25 um 12:31 schrieb Hannes Laimer:
> We don't want plain-text reports to contain HTML-escaped chars,
> this skips html encoding for the plain-text part.
> 
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
>  src/PMG/CLI/pmgqm.pm | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/src/PMG/CLI/pmgqm.pm b/src/PMG/CLI/pmgqm.pm
> index 41f9f1a..acac284 100755
> --- a/src/PMG/CLI/pmgqm.pm
> +++ b/src/PMG/CLI/pmgqm.pm
> @@ -45,17 +45,26 @@ sub get_item_data {
>  
>      $item->{id} = sprintf("C%dR%dT%d", $ref->{cid}, $ref->{rid}, $ref->{ticketid});
>  
> -    $item->{subject} =
> -        PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('subject')) || 'No Subject');
> +    my $raw_subject = PVE::Tools::trim($head->get('subject')) || 'No Subject';
> +    $item->{subject} = PMG::Utils::rfc1522_to_html($raw_subject);
> +    $item->{subject_plain} = PMG::Utils::decode_rfc1522($raw_subject);

Not sure as I did not check in depth, but should the result from decode_rfc1522
above also get encoded as UTF-8 to avoid issues with odd characters?

>  
> -    my $from = PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('from') // $ref->{sender}));
> -    my $sender = PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('sender')));
> +    my $raw_from = PVE::Tools::trim($head->get('from') // $ref->{sender});
> +    my $raw_sender = PVE::Tools::trim($head->get('sender'));
> +
> +    my $from = PMG::Utils::rfc1522_to_html($raw_from);
> +    my $sender = PMG::Utils::rfc1522_to_html($raw_sender);
> +
> +    my $from_plain = PMG::Utils::decode_rfc1522($raw_from);
> +    my $sender_plain = PMG::Utils::decode_rfc1522($raw_sender);

same here I think.

>  
>      if ($sender) {
>          $item->{sender} = $sender;
>          $item->{from} = sprintf("%s on behalf of %s", $sender, $from);
> +        $item->{from_plain} = sprintf("%s on behalf of %s", $sender_plain, $from_plain);
>      } else {
>          $item->{from} = $from;
> +        $item->{from_plain} = $from_plain;
>      }
>  
>      $item->{envelope_sender} = $ref->{sender};



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports
  2025-09-18 13:21   ` Thomas Lamprecht
@ 2025-09-18 14:08     ` Hannes Laimer
  0 siblings, 0 replies; 7+ messages in thread
From: Hannes Laimer @ 2025-09-18 14:08 UTC (permalink / raw)
  To: Thomas Lamprecht, pmg-devel

On 18.09.25 15:21, Thomas Lamprecht wrote:
> Am 18.09.25 um 12:31 schrieb Hannes Laimer:
>> We don't want plain-text reports to contain HTML-escaped chars,
>> this skips html encoding for the plain-text part.
>>
>> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
>> ---
>>   src/PMG/CLI/pmgqm.pm | 17 +++++++++++++----
>>   1 file changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/PMG/CLI/pmgqm.pm b/src/PMG/CLI/pmgqm.pm
>> index 41f9f1a..acac284 100755
>> --- a/src/PMG/CLI/pmgqm.pm
>> +++ b/src/PMG/CLI/pmgqm.pm
>> @@ -45,17 +45,26 @@ sub get_item_data {
>>   
>>       $item->{id} = sprintf("C%dR%dT%d", $ref->{cid}, $ref->{rid}, $ref->{ticketid});
>>   
>> -    $item->{subject} =
>> -        PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('subject')) || 'No Subject');
>> +    my $raw_subject = PVE::Tools::trim($head->get('subject')) || 'No Subject';
>> +    $item->{subject} = PMG::Utils::rfc1522_to_html($raw_subject);
>> +    $item->{subject_plain} = PMG::Utils::decode_rfc1522($raw_subject);
> 
> Not sure as I did not check in depth, but should the result from decode_rfc1522
> above also get encoded as UTF-8 to avoid issues with odd characters?
> 

did some digging, and yes, that seems to be the problem.
```
# assume enc contains utf-8 and mime-encoded data returns a perl-string 
(with wide characters)
sub decode_rfc1522 {
...

```
the template does not like getting `wide characters`, a
`Encode::encode('UTF-8', $plaintext)`
solves the problem. `rfc1522_to_html` already does basically this, and
`decode_rfc1522` does not. I'll fix that and send a v2.

Thanks for testing!


>>   
>> -    my $from = PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('from') // $ref->{sender}));
>> -    my $sender = PMG::Utils::rfc1522_to_html(PVE::Tools::trim($head->get('sender')));
>> +    my $raw_from = PVE::Tools::trim($head->get('from') // $ref->{sender});
>> +    my $raw_sender = PVE::Tools::trim($head->get('sender'));
>> +
>> +    my $from = PMG::Utils::rfc1522_to_html($raw_from);
>> +    my $sender = PMG::Utils::rfc1522_to_html($raw_sender);
>> +
>> +    my $from_plain = PMG::Utils::decode_rfc1522($raw_from);
>> +    my $sender_plain = PMG::Utils::decode_rfc1522($raw_sender);
> 
> same here I think.
> 
>>   
>>       if ($sender) {
>>           $item->{sender} = $sender;
>>           $item->{from} = sprintf("%s on behalf of %s", $sender, $from);
>> +        $item->{from_plain} = sprintf("%s on behalf of %s", $sender_plain, $from_plain);
>>       } else {
>>           $item->{from} = $from;
>> +        $item->{from_plain} = $from_plain;
>>       }
>>   
>>       $item->{envelope_sender} = $ref->{sender};
> 



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pmg-devel] superseded: [PATCH pmg-api 0/3] adds plain-text variants for both reports
  2025-09-18 10:30 [pmg-devel] [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
                   ` (2 preceding siblings ...)
  2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 3/3] fix #4023: templates: add plain-text variant of admin report Hannes Laimer
@ 2025-09-18 14:33 ` Hannes Laimer
  3 siblings, 0 replies; 7+ messages in thread
From: Hannes Laimer @ 2025-09-18 14:33 UTC (permalink / raw)
  To: pmg-devel

superseded-by: 
https://lore.proxmox.com/pmg-devel/20250918143142.248758-1-h.laimer@proxmox.com/T/#t

On 18.09.25 12:31, Hannes Laimer wrote:
> This addresses both #1621 and #4023. The plain-text parts are a little
> "spacey", but overall I think the formatting is fine.
> 
> https://bugzilla.proxmox.com/show_bug.cgi?id=4023
> https://bugzilla.proxmox.com/show_bug.cgi?id=1621
> 
> Hannes Laimer (3):
>    pmgqm: add plain subject/from fields for reports
>    fix #1621: templates: add plain-text variant of short/verbose spam
>      report
>    fix #4023: templates: add plain-text variant of admin report
> 
>   src/Makefile                              |  3 ++
>   src/PMG/CLI/pmgqm.pm                      | 17 ++++++--
>   src/templates/pmgreport.plain.tt          | 51 +++++++++++++++++++++++
>   src/templates/spamreport-short.plain.tt   | 21 ++++++++++
>   src/templates/spamreport-verbose.plain.tt | 25 +++++++++++
>   5 files changed, 113 insertions(+), 4 deletions(-)
>   create mode 100644 src/templates/pmgreport.plain.tt
>   create mode 100644 src/templates/spamreport-short.plain.tt
>   create mode 100644 src/templates/spamreport-verbose.plain.tt
> 



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-09-18 14:33 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-18 10:30 [pmg-devel] [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer
2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 1/3] pmgqm: add plain subject/from fields for reports Hannes Laimer
2025-09-18 13:21   ` Thomas Lamprecht
2025-09-18 14:08     ` Hannes Laimer
2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 2/3] fix #1621: templates: add plain-text variant of short/verbose spam report Hannes Laimer
2025-09-18 10:30 ` [pmg-devel] [PATCH pmg-api 3/3] fix #4023: templates: add plain-text variant of admin report Hannes Laimer
2025-09-18 14:33 ` [pmg-devel] superseded: [PATCH pmg-api 0/3] adds plain-text variants for both reports Hannes Laimer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal