From 533f7c30c233aa129fc3c2c887770778bf2dd898 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:00:00 +0200 Subject: [PATCH 01/10] fixup! events.pm: fix listen_key --- lib/calcms/events.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/calcms/events.pm b/lib/calcms/events.pm index 198030d..f6e8121 100644 --- a/lib/calcms/events.pm +++ b/lib/calcms/events.pm @@ -533,7 +533,7 @@ sub get_listen_key($$){ my $archive_dir = $config->{locations}->{local_archive_dir}; my $archive_url = $config->{locations}->{listen_url}; return $event->{listen_url} = $archive_url . '/' . $event->{listen_key} if - defined $event->{listen_key} and -l $archive_dir .'/'. $event->{listen_key}; + defined $event->{listen_key} && -l $archive_dir .'/'. $event->{listen_key}; set_listen_key($config, $event) unless $event->{listen_key}; } From 642e7397fdfa446552b00b8c8d44b1bca5226b9c Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:01:00 +0200 Subject: [PATCH 02/10] fixup! lib/calcms: remove comments and shorten expressions --- lib/calcms/series_dates.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/calcms/series_dates.pm b/lib/calcms/series_dates.pm index d7be3de..feceb95 100644 --- a/lib/calcms/series_dates.pm +++ b/lib/calcms/series_dates.pm @@ -521,7 +521,7 @@ sub delete ($$) { sub getDatesWithoutEvent ($$) { my ($config, $options) = @_; - for ('project_id', 'studio_id', 'form', 'till') { + for ('project_id', 'studio_id', 'from', 'till') { return unless defined $options->{$_} }; From f71d6e903052579611425f958aa494eaee9230f7 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:02:00 +0200 Subject: [PATCH 03/10] mail.pm: convert to ascii use Text::Unidecode to decode unicode, to prevent spam filter ignoring oddly encoded emails. --- install/INSTALL.md | 1 + lib/calcms/mail.pm | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/install/INSTALL.md b/install/INSTALL.md index 2b3ca7f..f9a5be2 100644 --- a/install/INSTALL.md +++ b/install/INSTALL.md @@ -96,6 +96,7 @@ apt-get install libmime-tools-perl libsession-token-perl libtext-multimarkdown-perl + libtext-unidecode libtext-wikicreole-perl liburi-escape-xs-perl perlmagick diff --git a/lib/calcms/mail.pm b/lib/calcms/mail.pm index 0ae856d..fb09583 100644 --- a/lib/calcms/mail.pm +++ b/lib/calcms/mail.pm @@ -3,11 +3,27 @@ package mail; use strict; use warnings; no warnings 'redefine'; +use utf8; use Email::Sender::Simple(); use Email::Simple(); -use MIME::Words qw(encode_mimeword); -use MIME::QuotedPrint qw(encode_qp); +use Text::Unidecode qw(unidecode); + +sub to_ascii { + my ($s) = @_; + my %translate = qw( + Ä Ae + ä ae + Ö Oe + ö oe + Ü Ue + ü ue + ß ss + ); + $s =~ s/([ÄäÖöÜüß])/$translate{$1}/g; + $s = unidecode $s; + return $s; +} sub send($) { my ($mail) = @_; @@ -15,14 +31,13 @@ sub send($) { my $email = Email::Simple->create( header => [ 'Content-Type' => 'text/plain;', - 'Content-Transfer-Encoding' => 'quoted-printable', 'From' => $mail->{'From'}, 'To' => $mail->{'To'}, 'Cc' => $mail->{'Cc'}, 'Reply-To' => $mail->{'Reply-To'}, - 'Subject' => encode_mimeword($mail->{'Subject'}, 'b', 'UTF-8') + 'Subject' => to_ascii($mail->{'Subject'}) ], - body => encode_qp($mail->{'Data'}), + body => to_ascii($mail->{'Data'}) ); Email::Sender::Simple->send($email); } From 674412344732bf4bc75e75823aad561ba8922f33 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:07:30 +0200 Subject: [PATCH 04/10] calcms.css: use woff2 fonts only --- website/agenda/css/calcms.css | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/website/agenda/css/calcms.css b/website/agenda/css/calcms.css index b33ab70..55f7642 100644 --- a/website/agenda/css/calcms.css +++ b/website/agenda/css/calcms.css @@ -2,32 +2,20 @@ border-radius:4px; } -/* roboto-regular - latin_latin-ext */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; - src: url('../fonts/roboto-v18-latin_latin-ext-regular.eot'); /* IE9 Compat Modes */ src: local('Roboto'), local('Roboto-Regular'), - url('../fonts/roboto-v18-latin_latin-ext-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/roboto-v18-latin_latin-ext-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/roboto-v18-latin_latin-ext-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/roboto-v18-latin_latin-ext-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/roboto-v18-latin_latin-ext-regular.svg#Roboto') format('svg'); /* Legacy iOS */ + url('../fonts/roboto-v18-latin_latin-ext-regular.woff2') format('woff2'), } -/* open-sans-regular - latin_latin-ext */ @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; - src: url('../fonts/open-sans-v15-latin_latin-ext-regular.eot'); /* IE9 Compat Modes */ src: local('Open Sans Regular'), local('OpenSans-Regular'), - url('../fonts/open-sans-v15-latin_latin-ext-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/open-sans-v15-latin_latin-ext-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/open-sans-v15-latin_latin-ext-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/open-sans-v15-latin_latin-ext-regular.svg#OpenSans') format('svg'); /* Legacy iOS */ + url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2'), } @media (prefers-color-scheme: dark) { From 61405a2644c4731967bc8bf21b7af0954087ffe2 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:08:44 +0200 Subject: [PATCH 05/10] install/create.sql: new index for events --- install/create.sql | 2 ++ install/migrate.sql | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/install/create.sql b/install/create.sql index 803dfa0..ca93986 100644 --- a/install/create.sql +++ b/install/create.sql @@ -1816,3 +1816,5 @@ CHANGE COLUMN `email` `email` VARCHAR(100) NULL DEFAULT NULL ; ALTER TABLE `calcms`.`calcms_user_selected_events` CHANGE COLUMN `user` `user` VARCHAR(100) NOT NULL ; + +CREATE INDEX idx_covering ON calcms_events (start, end, id); \ No newline at end of file diff --git a/install/migrate.sql b/install/migrate.sql index d788558..11dc0c3 100644 --- a/install/migrate.sql +++ b/install/migrate.sql @@ -361,4 +361,6 @@ ADD COLUMN `week_of_month` INT UNSIGNED NULL AFTER `weekday`, ADD COLUMN `month` INT UNSIGNED NULL AFTER `week_of_month`, CHANGE COLUMN `frequency` `frequency` INT UNSIGNED NULL ; -update `calcms_studio_timeslot_schedule` set period_type = 'days' where period_type = ''; \ No newline at end of file +update `calcms_studio_timeslot_schedule` set period_type = 'days' where period_type = ''; + +CREATE INDEX idx_covering ON calcms_events (start, end, id); \ No newline at end of file From 0c7cf1071aeabc1f2ae35debddcd32fed159b1d8 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:03:00 +0200 Subject: [PATCH 06/10] website/agenda/.htaccess: add route for running id --- website/agenda/.htaccess | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/website/agenda/.htaccess b/website/agenda/.htaccess index d35b4e5..5197303 100644 --- a/website/agenda/.htaccess +++ b/website/agenda/.htaccess @@ -38,6 +38,7 @@ RewriteRule ^playlistLong/(.*)$ events.cgi?template=event_playlist_long.html&t RewriteRule ^playlistUtc/(.*)$ events.cgi?template=event_utc_time.json&limit=1 RewriteRule ^running_event/(.*)$ events.cgi?template=event_running.html&time=now&limit=1&$1 [L] +RewriteRule ^running_event_id/(.*)$ events.cgi?template=event_running_id.html&time=now&limit=1&$1 [L] RewriteRule ^feed/(.*)$ events.cgi?template=event.atom.xml&time=future&limit=100&$1 [L] RewriteRule ^feed.xml[\?]?(.*)$ events.cgi?template=event.atom.xml&time=future&limit=100&$1 [L] RewriteRule ^atom/(.*)$ events.cgi?template=event.atom.xml&time=future&limit=100&$1 [L] @@ -106,15 +107,3 @@ Options -Indexes +FollowSymLinks +MultiViews +ExecCGI Require all granted - -## compress -# -# SetOutputFilter DEFLATE -# SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|mp3)$ no-gzip dont-vary -# Header append Vary User-Agent env=!dont-vary -# -# -# Header set Cache-Control "max-age=600, public" -# -# - From b7ff85f3a202fadd5f2d7da4419ad859ddc3a064 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:03:00 +0200 Subject: [PATCH 07/10] create-events.cgi: remove comments --- website/agenda/planung/create-events.cgi | 5 ----- 1 file changed, 5 deletions(-) diff --git a/website/agenda/planung/create-events.cgi b/website/agenda/planung/create-events.cgi index bd3e5a0..259c7fb 100755 --- a/website/agenda/planung/create-events.cgi +++ b/website/agenda/planung/create-events.cgi @@ -29,7 +29,6 @@ my $config = config::get('../config/config.cgi'); my ( $user, $expires ) = auth::get_user( $config, $params, $cgi ); return if ( ( !defined $user ) || ( $user eq '' ) ); -#print STDERR $params->{project_id}."\n"; my $user_presets = uac::get_user_presets( $config, { @@ -42,7 +41,6 @@ $params->{default_studio_id} = $user_presets->{studio_id}; $params = uac::setDefaultStudio( $params, $user_presets ); $params = uac::setDefaultProject( $params, $user_presets ); -#print STDERR $params->{project_id}."\n"; my $request = { url => $ENV{QUERY_STRING} || '', params => { @@ -80,7 +78,6 @@ sub show_events { uac::permissions_denied('read_events'); return; } - my $events = getDates( $config, $request ); $params->{events} = $events; $params->{total} = scalar(@$events); @@ -107,8 +104,6 @@ sub create_events { print STDERR "
found " . ( scalar @$dates ) . " dates\n";
     my $events = [];
     for my $date (@$dates) {
-
-        #print STDERR $date->{start}."\n";
         push @$events, createEvent( $config, $request, $date );
     }
     $params->{events} = $events;

From 4689dee2153d9a9c71d73d296a801a3c91b550e9 Mon Sep 17 00:00:00 2001
From: Milan 
Date: Fri, 26 Jul 2024 21:03:00 +0200
Subject: [PATCH 08/10] notify-events: show results

---
 website/agenda/planung/css/notify-events.css  | 15 +++++++++++--
 website/agenda/planung/js/notify-events.js    | 19 +++++++++++-----
 website/agenda/planung/notify-events.cgi      | 15 ++++++++-----
 .../agenda/planung/pot/de/notify-events.po    |  2 ++
 .../agenda/planung/pot/en/notify-events.po    |  2 ++
 .../planung/templates/notify-events.html      | 22 ++++++++++++-------
 6 files changed, 53 insertions(+), 22 deletions(-)

diff --git a/website/agenda/planung/css/notify-events.css b/website/agenda/planung/css/notify-events.css
index bbc21ec..68046a3 100644
--- a/website/agenda/planung/css/notify-events.css
+++ b/website/agenda/planung/css/notify-events.css
@@ -2,8 +2,19 @@ table#events{
     transition:all 2s;
 }
 
-table#events.done{
-    background:#cfc;
+table#events div.error{
+    background: #f33;
+    color:white;
+    padding:1rem;
+    width: 30rem;
+}
+
+
+table#events div.done{
+    background: #3f3;
+    color:white;
+    padding:1rem;
+    width: 30rem;
 }
 
 table#events td:nth-of-type(1){
diff --git a/website/agenda/planung/js/notify-events.js b/website/agenda/planung/js/notify-events.js
index 98d0cf1..7d430cc 100644
--- a/website/agenda/planung/js/notify-events.js
+++ b/website/agenda/planung/js/notify-events.js
@@ -1,13 +1,20 @@
 function register_buttons() {
     $("#forms form").on('click', 'button', function( event ) {
         event.preventDefault();
-        var form = $(this).closest('form');
+        let form = $(this).closest('form');
+        let formId = form.attr('id');
+        let table = $('#' + formId+" table");
+        let  status = table.find("td.result div");
+        status.text('').removeClass("error").removeClass("done");
+
         $.post("notify-events.cgi", form.serialize())
-        .done( function(data) {
-            var content = $(data).find("#content");
-            $('#result').html(content);
-            var formId = form.attr('id');
-            $('#' + formId+" table").addClass("done");
+        .always( function(data) {
+            if (data.includes("done")){
+                status.text("ok").removeClass("error").addClass("done");
+            } else {
+                status.text(data).removeClass("ok").addClass("error");
+            }
+            table.find("tr.result").show();
         });
     });
 }
diff --git a/website/agenda/planung/notify-events.cgi b/website/agenda/planung/notify-events.cgi
index 4e01d02..b72b163 100755
--- a/website/agenda/planung/notify-events.cgi
+++ b/website/agenda/planung/notify-events.cgi
@@ -6,6 +6,7 @@ no warnings 'redefine';
 use utf8;
 
 use Data::Dumper;
+use Try::Tiny;
 
 use params();
 use config();
@@ -53,11 +54,10 @@ my $request = {
 
 #set user at params->presets->user
 $request = uac::prepare_request( $request, $user_presets );
-
 $params = $request->{params}->{checked};
 
 #show header
-unless ( params::isJson() || ( $params->{template} =~ /\.txt/ ) ) {
+unless ( params::isJson() || ( $params->{template} =~ /\.txt/ ) || $params->{action}eq'send' ) {
     my $headerParams = uac::set_template_permissions( $request->{permissions}, $params );
     $headerParams->{loc} = localization::get( $config, { user => $user, file => 'menu' } );
     template::process( $config, 'print', template::check( $config, 'default.html' ), $headerParams );
@@ -162,8 +162,13 @@ sub sendMail {
     $mail->{Cc}      = $params->{cc}      if defined $params->{cc};
     $mail->{Subject} = $params->{subject} if defined $params->{subject};
     $mail->{Data}    = $params->{content} if defined $params->{content};
-    my $result = mail::send($mail);
-    print "Content-type:text/plain\n\nresult:".Dumper($result);
+
+    try {
+        my $result = mail::send($mail);
+        print "Content-type:text/plain\n\ndone:$result\n";
+    } catch {
+        printf "Content-type:text/plain\n\nresult:%s\n", $_->{message} // $_;
+    }
 }
 
 sub getMail {
@@ -214,8 +219,6 @@ sub eventToText {
     $s .= $event->{user_excerpt} . "\n";
     $s .= $event->{topic} . "\n";
     $s .= $event->{content} . "\n";
-
-    #print STDERR "DUMP\n$s";
     return $s;
 
 }
diff --git a/website/agenda/planung/pot/de/notify-events.po b/website/agenda/planung/pot/de/notify-events.po
index dc8c301..38e5eb0 100644
--- a/website/agenda/planung/pot/de/notify-events.po
+++ b/website/agenda/planung/pot/de/notify-events.po
@@ -28,3 +28,5 @@ msgstr "Inhalt"
 msgid "show_details"
 msgstr "Zeige Details"
 
+msgid "result"
+msgstr "Ergebnis"
diff --git a/website/agenda/planung/pot/en/notify-events.po b/website/agenda/planung/pot/en/notify-events.po
index a25913e..6435d03 100644
--- a/website/agenda/planung/pot/en/notify-events.po
+++ b/website/agenda/planung/pot/en/notify-events.po
@@ -28,3 +28,5 @@ msgstr "Content"
 msgid "show_details"
 msgstr "Show Details"
 
+msgid "result"
+msgstr "Result"
diff --git a/website/agenda/planung/templates/notify-events.html b/website/agenda/planung/templates/notify-events.html
index 667894b..f86d7f8 100644
--- a/website/agenda/planung/templates/notify-events.html
+++ b/website/agenda/planung/templates/notify-events.html
@@ -43,15 +43,15 @@
             
         
 
-    
+
         
-        
+    
 
-        
-            Warning
-            
no recipient configured at series!
- - + + Warning +
no recipient configured at series!
+ + @@ -63,12 +63,18 @@
+ + +
+ + + @@ -97,7 +103,7 @@ -
+ From 80cbaf70bc5ccb834c4b5b4cb0f0318d74041b9f Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 21:52:07 +0200 Subject: [PATCH 09/10] fixup! templates: fix javascript escaping --- website/agenda/planung/templates/studios.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/agenda/planung/templates/studios.html b/website/agenda/planung/templates/studios.html index 4dd5e4b..8a4b1e4 100644 --- a/website/agenda/planung/templates/studios.html +++ b/website/agenda/planung/templates/studios.html @@ -66,7 +66,7 @@ From 492bc44cdae3d34d39ed6262a03a278abd9128d4 Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 26 Jul 2024 22:03:06 +0200 Subject: [PATCH 10/10] lib/calcms/user_sessions.pm: always write session --- lib/calcms/user_sessions.pm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/calcms/user_sessions.pm b/lib/calcms/user_sessions.pm index 965d2da..fd3f053 100644 --- a/lib/calcms/user_sessions.pm +++ b/lib/calcms/user_sessions.pm @@ -86,9 +86,11 @@ sub insert ($$) { $entry->{pid} = $$; $entry->{expires_at} = time::time_to_datetime( time() + $entry->{timeout} ); - + $config->{access}->{write} = 1; my $dbh = db::connect($config); - return db::insert( $dbh, 'calcms_user_sessions', $entry ); + my $result = db::insert( $dbh, 'calcms_user_sessions', $entry ); + $config->{access}->{write} = 0; + return $result; } # start session and return generated session id @@ -176,6 +178,7 @@ sub update ($$) { return undef unless defined $entry->{session_id}; + $config->{access}->{write} = 1; my $dbh = db::connect($config); my @keys = sort keys %$entry; my $values = join( ",", map { $_ . '=?' } @keys ); @@ -187,7 +190,9 @@ sub update ($$) { set $values where session_id=? }; - return db::put( $dbh, $query, \@bind_values ); + my $result = db::put( $dbh, $query, \@bind_values ); + $config->{access}->{write} = 0; + return $result; } #map schedule id to id