#!/usr/bin/perl # MimerDesk # Web based groupware and eLearning environment # www.mimerdesk.org # # Copyright (C) 2001 Ionstream Ltd. # www.ionstream.fi # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed with a hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: messages.html,v 1.14 2002/07/15 08:58:18 inf Exp $ ########################################### # # # MimerDesk: Communication - Messages # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # (c) Ionstream Oy 1999 - 2001 # # # # Programmed by: Teemu Arina # # # ########################################### # Asetukset ################################## # Begin ################################## use strict; use vars qw ($APPLICATION $ACTIVEGRP $USER $close $IP $LAST_ACT $FORWARDED $TIME_USED $IDLE $form $ref $sth $length $cellcolors $numbercolor %day_names %month_names $trans); use lib::MimerDesk; use CGI::Carp "fatalsToBrowser"; $APPLICATION = 'Communication - Messages'; $length = 45; $cellcolors = "FFFFFF"; $numbercolor = "E7EBF1"; sub print_template; sub hae_kayttajat; sub send_message; sub send_message2; sub show_message2; sub show_message; sub kill_messages; sub accept_membership; sub reject_membership; sub join_group; sub dontjoin_group; # Ohjelma ################################## read_config('../config/mimerdesk.cfg'); initialize(); $form = decode_multipart(); $form->{'ID'} =~ tr/0-9//cd; $form->{'auth'} =~ tr/0-9a-z//cd; ($USER, $IP, $LAST_ACT, $FORWARDED, $TIME_USED, $IDLE, $ACTIVEGRP) = authenticate($form->{'ID'}, $form->{'auth'}, $form->{'changeGroup'}); $trans = lib::MimerDesk->new_gettext(program => 'messages',language => $config{'language'}); $APPLICATION = $trans->gettext('Communication - Messages'); $close = qq[].$trans->gettext('Close this window').qq[]; %day_names = (0 => $trans->gettext('Sat'), 1 => $trans->gettext('Sun'), 2 => $trans->gettext('Mon'), 3 => $trans->gettext('Tue'), 4 => $trans->gettext('Wed'), 5 => $trans->gettext('Thu'), 6 => $trans->gettext('Fri')); %month_names = ( 1 => $trans->gettext('January'), 2 => $trans->gettext('February'), 3 => $trans->gettext('March'), 4 => $trans->gettext('April'), 5 => $trans->gettext('May'), 6 => $trans->gettext('June'), 7 => $trans->gettext('July'), 8 => $trans->gettext('August'), 9 => $trans->gettext('September'), 10 => $trans->gettext('October'), 11 => $trans->gettext('November'), 12 => $trans->gettext('December'), '01' => $trans->gettext('January'), '02' => $trans->gettext('February'), '03' => $trans->gettext('March'), '04' => $trans->gettext('April'), '05' => $trans->gettext('May'), '06' => $trans->gettext('June'), '07' => $trans->gettext('July'), '08' => $trans->gettext('August'), '09' => $trans->gettext('September') ); if ($form->{'quit'}) {redirect("$config{'loc_server'}$config{'bin_dir'}/index.html?ID=$form->{'ID'}&auth=$form->{'auth'}&quit=quit");} elsif ($form->{'messageID'} =~ /^\d+$/) {show_message();} elsif ($form->{'userID'} && $form->{'GID'} =~ /^\d+$/) { if ($form->{'accept.x'}) {accept_membership();} elsif ($form->{'reject.x'}) {reject_membership();} elsif ($form->{'join'}) {join_group();} elsif ($form->{'nojoin'}) {dontjoin_group();} } elsif ($form->{'eventsender'}) { if($form->{'eventadd'}) {add_cal_events();} elsif($form->{'noeventadd'}) {reject_cal_events();} } elsif ($form->{'reminderaction'}) { if($form->{'removeReminder'}) {removeReminder();} elsif($form->{'postponeReminder'}) {postponeReminder();} } elsif ($form->{'taskSender'}) { if($form->{'addTask'}) {add_task();} elsif($form->{'rejectTask'}) {reject_task();} } exit; ##################### # Accept membership # ##################### sub accept_membership { my ($warning); ($form->{'userID'}) = prepare_fordb($form->{'userID'}); if (!db_select('TYPE','messages', "TYPE = 'JOING' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { ($ref) = db_select('groupusers.RIGHTS,groups.GRPNAME','groupusers,groups',"groupusers.GID = '$form->{'GID'}' and groupusers.USER = '$USER' and groupusers.GID = groups.GID"); if ($ref->{'RIGHTS'} !~ /G0/) {$warning = tagged('div',{class => 'error', content => $trans->gettext('You don\'t own this group!')});} else { lock_tables('WRITE', 'messages','groupusers'); my $time = time(); db_delete('messages',"TYPE = 'JOING' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'"); my %gusers = ( 'USER' => $form->{'userID'}, 'GID' => $form->{'GID'}, 'RIGHTS' => $config{'new_groupmember'} ); db_insert("groupusers",\%gusers); db_end(); unlock_tables(); my $time = time(); my $message = "[B]You have been accepted as a member in group $ref->{'GRPNAME'}![/B]"; my ($targetDB); lock_tables('READ', 'users'); db_list("select UID from users where nimi = '$form->{'userID'}'"); while (my $ref = $sth->fetchrow_hashref()) { $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', $targetDB); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $form->{'userID'}, 'time' => $time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = sprintf($trans->gettext('User %s has been accepted as a member in group %s.'),$form->{'userID'},$ref->{'GRPNAME'}); } } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].sprintf($trans->gettext('Membership request from %s.'),$form->{'userID'}).qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } ##################### # Reject membership # ##################### sub reject_membership { my ($warning); ($form->{'userID'}) = prepare_fordb($form->{'userID'}); if (!db_select('TYPE','messages', "TYPE = 'JOING' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { ($ref) = db_select('groupusers.RIGHTS,groups.GRPNAME','groupusers,groups',"groupusers.GID = '$form->{'GID'}' and groupusers.USER = '$USER' and groupusers.GID = groups.GID"); if ($ref->{'RIGHTS'} !~ /G0/) {$warning = tagged('div',{class => 'error', content => $trans->gettext('You don\'t own this group!')});} else { lock_tables('WRITE', 'messages'); my $time = time(); db_delete('messages',"TYPE = 'JOING' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'"); db_end(); my $time = time(); my $message = sprintf($trans->gettext('[B]Your request for membership in group %s has been denied![/B]'),$ref->{'GRPNAME'}); unlock_tables(); my ($targetDB); lock_tables('READ', 'users'); db_list("select UID from users where nimi = '$form->{'userID'}'"); while (my $ref = $sth->fetchrow_hashref()) { $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', $targetDB); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $form->{'userID'}, 'time' => $time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = sprintf($trans->gettext('User %s has been denied membership in group %s.'),$form->{'userID'},$ref->{'GRPNAME'}); } } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].sprintf($trans->gettext('Membership request from %s.'),$form->{'userID'}).qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } ############## # Join group # ############## sub join_group { my ($warning); ($form->{'userID'}) = prepare_fordb($form->{'userID'}); if (!db_select('TYPE','messages', "TYPE = 'INVITE' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { lock_tables('WRITE', 'messages','groupusers', 'groups'); my $time = time(); db_delete('messages',"TYPE = 'INVITE' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'"); my %gusers = ( 'USER' => $USER, 'GID' => $form->{'GID'}, 'RIGHTS' => $config{'new_groupmember'} ); db_insert("groupusers",\%gusers); db_end(); unlock_tables(); my $time = time(); ($ref) = db_select('GRPNAME','groups',"GID = '$form->{'GID'}'"); my $message = sprintf($trans->gettext('[B]I have accepted the invitation to join the group %s![/B]'),$ref->{'GRPNAME'}); my ($targetDB); lock_tables('READ', 'users'); db_list("select UID from users where nimi = '$form->{'userID'}'"); while (my $ref = $sth->fetchrow_hashref()) { $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', $targetDB); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $form->{'userID'}, 'time' => $time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = sprintf($trans->gettext('You are now a member of the group %s!'),$ref->{'GRPNAME'}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].sprintf($trans->gettext('Invitation by %s'),$form->{'userID'}).qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } ######################## # Don't join the group # ######################## sub dontjoin_group { my ($warning); ($form->{'userID'}) = prepare_fordb($form->{'userID'}); if (!db_select('TYPE','messages', "TYPE = 'INVITE' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { lock_tables('WRITE', 'messages', 'groups'); my $time = time(); db_delete('messages',"TYPE = 'INVITE' and SENDER = '$form->{'userID'}' and TARGET = '$USER' and MESSAGE like '$form->{'GID'}%'"); db_end(); my $time = time(); ($ref) = db_select('GRPNAME','groups',"GID = '$form->{'GID'}'"); my $message = sprintf($trans->gettext('[B]I have rejected the invitation to join the group %s![/B]'),$ref->{'GRPNAME'}); unlock_tables(); my ($targetDB); lock_tables('READ', 'users'); db_list("select UID from users where nimi = '$form->{'userID'}'"); while (my $ref = $sth->fetchrow_hashref()) { $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', $targetDB); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $form->{'userID'}, 'time' => $time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = sprintf($trans->gettext('You have rejected the invitation to join the group %s!'),$ref->{'GRPNAME'}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].sprintf($trans->gettext('Invitation by %s'),$form->{'userID'}).qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } ########################## # Show requested message # ########################## sub show_message { my ($sender,$nimi,$sendtime,$message,$type,$topic,$button); my $local_time = time; lock_tables('READ','users','messages'); db_list("select messages.SENDER,messages.MESSAGE,messages.TIME,messages.TYPE,messages.SEND_TIME,users.info from users,messages where messages.LINE = '$form->{'messageID'}' and messages.TARGET = '$USER' and messages.SENDER = users.nimi and messages.SEND_TIME < '$local_time'"); while (my $ref = $sth->fetchrow_hashref()) { $sender = $ref->{'SENDER'}; $nimi = $ref->{'info'}; $sendtime = $ref->{'TIME'}; $message = $ref->{'MESSAGE'}; $type = $ref->{'TYPE'}; } db_end(); unlock_tables(); my (undef,$m,$h,$md,$mo,$y,undef,undef,undef) = utc_epoch2date($sendtime); $sendtime = "$y/$mo/$md $h:$m"; if ($type eq 'JOING') { $message =~ /^(\d+)/; my $groupID = $1; foreach (db_select("GRPNAME","groups","GID = '$groupID'")) { $message = tagged('b', {content => $trans->gettext('MEMBERSHIP REQUEST')}) .tag('br').tag('br'). tagged('b', {content => $trans->gettext('Username: ')}).$sender.tag('br'). tagged('b', {content => $trans->gettext('Name: ')}).$nimi.tag('br'). tagged('b', {content => $trans->gettext('Group to join: ')}).$_->{'GRPNAME'}.tag('br').tag('br').tag('br'). $trans->gettext('Do you want to accept this user as a member?'); } $topic = qq[$sendtime - ].sprintf($trans->gettext('From %s (%s)'),$sender,$nimi).qq[]; $button = qq[   ]; } elsif ($type eq 'INVITE') { $message =~ /^(\d+)\,(.*)/; my $groupID = $1; my $invitemessage = $2; foreach (db_select("GRPNAME,DESCRIPTION","groups","GID = '$groupID'")) { $message = tagged('b', {content => $trans->gettext('INVITATION TO JOIN A GROUP')}) .tag('br').tag('br'). tagged('b', {content => $trans->gettext('Group: ')}).$_->{'GRPNAME'}.tag('br'). tagged('b', {content => $trans->gettext('Group description: ')}).$_->{'DESCRIPTION'}.tag('br'). tagged('b', {content => $trans->gettext('Invitation send by: ')})."$sender ($nimi)".tag('br'). tagged('b', {content => $trans->gettext('Invitation message: ')}).$invitemessage.tag('br').tag('br').tag('br'). $trans->gettext('Do you want to join this group?'); } $topic = qq[$sendtime - ].sprintf($trans->gettext('From %s (%s)'),$sender,$nimi).qq[]; $button = qq[].picbutton(form => 'form',name => 'join', image => 'join.gif').qq[   ].picbutton(form => 'form',name => 'nojoin', image => 'reject.gif'); } elsif ($type eq 'CALENDAR') { $message =~ /^(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)/sm; my ($groupID,$grouptool,$eventEpoch,$eventEndEpoch,$eventType,$eventTime,$eventSummary,$eventText) = ($1,$2,$3,$4,$5,$6,$7,$8); my $grouptext = ''; my $groupidtext = ''; if ($grouptool) { ($ref) = db_select('GRPNAME','groups',"GID = '$grouptool'"); $grouptext = sprintf($trans->gettext(' from the calendar of the group %s'),$ref->{'GRPNAME'}); } if ($groupID) { ($ref) = db_select('GRPNAME','groups',"GID = '$groupID'"); $groupidtext = sprintf($trans->gettext(' to the calendar of the group %s'),$ref->{'GRPNAME'}); } my $realmessage = tagged('b', {content => $trans->gettext('CALENDAR EVENT REQUEST')}) .tag('br').tag('br'). tagged('b', {content => sprintf($trans->gettext('%s has sent you the following event%s%s:'),$sender,$grouptext,$groupidtext)}).tag('br').tag('br'); my @startdate = utc_epoch2date($eventEpoch); my @enddate = utc_epoch2date($eventEndEpoch); my $printedEventText = itag_replacer($eventText); $printedEventText =~ s/\n/
/msg; my $second_date_stuff = ''; $second_date_stuff = " ".$day_names{day_of_the_week($enddate[3],$enddate[4],$enddate[5])}." $enddate[3] $month_names{$enddate[4]} $enddate[5]" if day_num($startdate[3],$startdate[4],$startdate[5]) != day_num($enddate[3],$enddate[4],$enddate[5]); my $end_of_date_text; $end_of_date_text = " $startdate[2]:$startdate[1] -$second_date_stuff $enddate[2]:$enddate[1]" if $eventTime ne 'full'; $realmessage .= tagged('b', {content => $trans->gettext('Title: ')}). $eventSummary.tag('br'). tagged('b', {content => $trans->gettext('Description: ')}). $printedEventText.tag('br'). tagged('b', {content => $trans->gettext('Date and time: ')}). $day_names{day_of_the_week($startdate[3],$startdate[4],$startdate[5])}." $startdate[3] $month_names{$startdate[4]} $startdate[5]$end_of_date_text ".tag('br'). tagged('b', {content => $trans->gettext('Category: ')}). $eventType.tag('br').tag('br'); $realmessage .= tagged('b', {content => $trans->gettext('Add this event to your calendar?')}); # MUUTETTU!! $eventType =~ s/"//gsm; $eventSummary =~ s/"//gsm; $eventText =~ s/"//gsm; $topic = qq[$sendtime - ].sprintf($trans->gettext('From %s (%s)'),$sender,$nimi).qq[]; $button = qq[].picbutton(form => 'form',name => 'eventadd', image => 'add.gif').qq[   ].picbutton(form => 'form',name => 'noeventadd', image => 'reject.gif'); $message = $realmessage; } elsif ($type eq 'REMINDER') { $message =~ /^(.+)\/(.*)/; my $eventID = $1; my $grouptool = $2; my $CALENDAR = 'calendar'; my $caluser = $sender; my $grouptext = ''; if ($grouptool) { $CALENDAR = $grouptool."_$CALENDAR"; ($ref) = db_select('GRPNAME','groups',"GID = '$grouptool'"); $caluser = $ref->{'GRPNAME'}; $grouptext = sprintf($trans->gettext(' from the calendar of the group %s'),$caluser); } foreach (db_select("*",$CALENDAR,"user = '$caluser' and IDnumber = '$eventID'")) { my @startdate = utc_epoch2date($_->{'epoch'}); my @enddate = utc_epoch2date($_->{'end_epoch'}); my @recenddate = utc_epoch2date($_->{'rec_end_epoch'}); my $second_date_stuff = ''; $_->{'text'} =~ s/\n/
/msg; $second_date_stuff = " ".$day_names{day_of_the_week($enddate[3],$enddate[4],$enddate[5])}." $enddate[3] $month_names{$enddate[4]} $enddate[5]" if day_num($startdate[3],$startdate[4],$startdate[5]) != day_num($enddate[3],$enddate[4],$enddate[5]); $message = tagged('b', {content => $trans->gettext('REMINDER OF AN EVENT/APPOINTMENT')}) .tag('br').tag('br'). tagged('b', {content => $trans->gettext('Title: ')}).$_->{'summary'}.tag('br'). tagged('b', {content => $trans->gettext('Description: ')}).$_->{'text'}.tag('br'). tagged('b', {content => $trans->gettext('Date and time: ')}).$day_names{day_of_the_week($startdate[3],$startdate[4],$startdate[5])}." $startdate[3] $month_names{$startdate[4]} $startdate[5] $startdate[2]:$startdate[1] -$second_date_stuff $enddate[2]:$enddate[1] ".tag('br'). tagged('b', {content => $trans->gettext('Category: ')}).$_->{'type'}.tag('br').tag('br'); } $topic = qq[$sendtime - ].$trans->gettext('Reminder').qq[]; $button = qq[].picbutton(form => 'form',name => 'removeReminder', image => 'ok.gif').qq[   ].picbutton(form => 'form',name => 'postponeReminder', image => 'postponereminder.gif'); } elsif ($type eq 'TODO') { $message =~ /^(.+)\/(.*)\/(.*)\/(.*)\/(.*)/sm; my ($duedate, $priority, $category, $summary, $description) = ($1, $2, $3, $4, $5); my %priority_text = ( 1 => $trans->gettext('Highest'), 2 => $trans->gettext('High'), 3 => $trans->gettext('Medium'), 4 => $trans->gettext('Low'), 5 => $trans->gettext('Lowest'), ); my ($duetext); if ($duedate eq 'NULL') { $duetext = '-'; } else { my ($tday, $tmonth, $tyear); (undef, undef, undef, $tday, $tmonth, $tyear, undef, undef, undef) = utc_epoch2date($duedate); $duetext = $day_names{day_of_the_week($tday, $tmonth, $tyear)}." $tday $month_names{$tmonth} $tyear"; } my $shown_description = $description; $shown_description =~ s/\n/
/sgm; $message = tagged('b', {content => $trans->gettext('TASK REQUEST')}) . tag('br') . tag('br') . tagged('b', {content => sprintf($trans->gettext('%s has requested you to do the following task:'),$sender)}) . tag('br') . tag('br') . tagged('b', {content => $trans->gettext('Summary: ')}) . $summary . tag('br') . tagged('b', {content => $trans->gettext('Priority: ')}) . $priority_text{$priority} . tag('br') . tagged('b', {content => $trans->gettext('Due date: ')}) . $duetext . tag('br') . tagged('b', {content => $trans->gettext('Description: ')}) . $shown_description . tag('br') . tagged('b', {content => $trans->gettext('Category: ')}) . $category . tag('br') . tag('br') . tagged('b', {content => $trans->gettext('Add this task to your todo-list?')}) . tag('br') . tag('br'); $topic = qq[$sendtime - ].$trans->gettext('Task request').qq[]; $button = qq[].picbutton(form => 'form',name => 'addTask', image => 'add.gif').qq[   ].picbutton(form => 'form',name => 'rejectTask', image => 'reject.gif'); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$button/ms; $fulltemplate =~ s/<>/$message/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } ######## sub add_cal_events { my $sender = $form->{'eventsender'}; my $groupID = $form->{'groupID'}; my $myCALENDAR = 'calendar'; my $mycaluser = $USER; if ($groupID) { lock_tables('READ','groups'); ($ref) = db_select('GRPNAME','groups',"GID = '$groupID'"); unlock_tables(); $myCALENDAR = "${groupID}_${myCALENDAR}"; $mycaluser = $ref->{'GRPNAME'}; # Tässä pitäis muuten tsekata käyttäjän admin-oikeudet. Ei-admineille ei kyllä lähetetä calendar-viestejä, mut urlin kanssa säätämällä voi saada lisättyä jotain ryhmäkalentereihin } my ($warning); ($form->{'userID'},$form->{'eventSummary'},$form->{'eventText'}, $form->{'eventType'}) = prepare_fordb($form->{'userID'},$form->{'eventSummary'},$form->{'eventText'}, $form->{'eventType'}); if (!db_select('TYPE','messages', "TYPE = 'CALENDAR' and TARGET = '$USER' and SENDER = '$sender' and MESSAGE like '$form->{'groupID'}/$form->{'calgroupID'}/$form->{'eventEpoch'}/$form->{'eventEndEpoch'}/$form->{'eventType'}/$form->{'eventTime'}/$form->{'eventSummary'}/%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!') . "$form->{'groupID'}/$form->{'calgroupID'}/$form->{'eventEpoch'}/$form->{'eventEndEpoch'}/$form->{'eventType'}/$form->{'eventTime'}/$form->{'eventSummary'}/$form->{'eventText'}"});} else { lock_tables('WRITE', 'messages', $myCALENDAR); my $time = time(); db_delete('messages',"TYPE = 'CALENDAR' and SENDER = '$sender' and TARGET = '$USER' and MESSAGE like '$form->{'groupID'}/$form->{'calgroupID'}/$form->{'eventEpoch'}/$form->{'eventEndEpoch'}/$form->{'eventType'}/$form->{'eventTime'}/$form->{'eventSummary'}/%'"); my %calendarDB = ( user => $mycaluser, epoch => $form->{'eventEpoch'}, end_epoch => $form->{'eventEndEpoch'}, type => $form->{'eventType'}, 'time' => $form->{'eventTime'}, recrule => 'norec', prevrec => 0, nextrec => 0, summary => $form->{'eventSummary'}, text => $form->{'eventText'}, reminderID => 0 ); db_insert($myCALENDAR,\%calendarDB); db_end(); unlock_tables(); my $message = $trans->gettext('[B]I have accepted the following event:[/B]')." $form->{'eventSummary'}"; # GETTEXT MUUTETTU!!! my ($targetDB); lock_tables('READ', 'users'); db_list("select UID from users where nimi = '$sender'"); while (my $ref = $sth->fetchrow_hashref()) { $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', $targetDB); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $sender, 'time' => $time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = tagged('b', {content => $trans->gettext('The events have been added to your calendar!')}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].$trans->gettext('Calendar event sharing').qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } sub reject_cal_events { my $caluser = $form->{'eventsender'}; ($caluser) = prepare_fordb($caluser); my ($warning); ($form->{'userID'},$form->{'eventSummary'},$form->{'eventText'}, $form->{'eventType'}) = prepare_fordb($form->{'userID'},$form->{'eventSummary'},$form->{'eventText'}, $form->{'eventType'}); if (!db_select('TYPE','messages', "TYPE = 'CALENDAR' and TARGET = '$USER' and SENDER = '$caluser' and MESSAGE like '$form->{'groupID'}/$form->{'calgroupID'}/$form->{'eventEpoch'}/$form->{'eventEndEpoch'}/$form->{'eventType'}/$form->{'eventTime'}/$form->{'eventSummary'}/%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { lock_tables('WRITE', 'messages'); my $time = time(); db_delete('messages',"TYPE = 'CALENDAR' and SENDER = '$caluser' and TARGET = '$USER' and MESSAGE like '$form->{'groupID'}/$form->{'calgroupID'}/$form->{'eventEpoch'}/$form->{'eventEndEpoch'}/$form->{'eventType'}/$form->{'eventTime'}/$form->{'eventSummary'}/%'"); my $time = time(); my $message = $trans->gettext('[B]I have rejected the following event:[/B]')." $form->{'eventSummary'}"; # GETTEXT MUUTETTU!!! my ($targetDB); unlock_tables(); lock_tables('READ', 'users'); db_list("select UID from users where nimi = '$caluser'"); while (my $ref = $sth->fetchrow_hashref()) { $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', $targetDB); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $caluser, 'time' => $time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = sprintf(tagged('b', {content => $trans->gettext('A rejection message has been sent to %s.')}), $caluser); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].$trans->gettext('Calendar event sharing').qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } sub removeReminder { my $caluser = $form->{'reminderaction'}; ($caluser) = prepare_fordb($caluser); my ($warning); if (!db_select('TYPE','messages', "TYPE = 'REMINDER' and SENDER = '$caluser' and MESSAGE like '$form->{'eventID'}%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { lock_tables('WRITE', 'messages'); my $time = time(); my %db = ('STATUS' => 'sent'); db_update('messages',\%db , "TYPE = 'REMINDER' and SENDER = '$caluser' and TARGET = '$USER' and MESSAGE like '$form->{'eventID'}%'"); db_end(); unlock_tables(); $warning = tagged('b', {content => $trans->gettext('The reminder has been deactivated.')}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].$trans->gettext('Reminder').qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } sub postponeReminder { my $caluser = $form->{'reminderaction'}; ($caluser) = prepare_fordb($caluser); my ($warning); if (!db_select('TYPE','messages', "TYPE = 'REMINDER' and SENDER = '$caluser' and MESSAGE like '$form->{'eventID'}%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { lock_tables('WRITE', 'messages'); my $time = time(); my %db = ('SEND_TIME' => $time+900); db_update('messages',\%db , "TYPE = 'REMINDER' and SENDER = '$caluser' and TARGET = '$USER' and MESSAGE like '$form->{'eventID'}%'"); db_end(); unlock_tables(); $warning = tagged('b', {content => $trans->gettext('The reminder has been postponed.')}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].$trans->gettext('Reminder').qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } sub add_task { my $tasksender = $form->{'taskSender'}; ($tasksender) = prepare_fordb($tasksender); my ($warning); ($form->{'taskSummary'},$form->{'taskCategory'}) = prepare_fordb($form->{'taskSummary'},$form->{'taskCategory'}); if (!db_select('TYPE','messages', "TYPE = 'TODO' and SENDER = '$tasksender' and TARGET = '$USER' and MESSAGE like '$form->{'taskDuedate'}/$form->{'taskPriority'}/$form->{'taskCategory'}/$form->{'taskSummary'}/%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { my ($nimi, $targetDB); lock_tables('READ', 'users'); db_list("select nimi,UID from users where nimi = '$tasksender'"); while (my $ref = $sth->fetchrow_hashref()) {$nimi = $ref->{'nimi'}; $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', 'messages', $targetDB, 'todo'); my $time = time(); db_delete('messages',"TYPE = 'TODO' and SENDER = '$tasksender' and TARGET = '$USER' and MESSAGE like '$form->{'taskDuedate'}/$form->{'taskPriority'}/$form->{'taskCategory'}/$form->{'taskSummary'}/%'"); my $time = time(); my $message = sprintf($trans->gettext('[B]I have accepted the task "%s"![/B]'),$form->{'taskSummary'}); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $tasksender, 'time' => time, status => 'Not read', message => $message}); db_end(); ($form->{'taskSummary'},$form->{'taskDescription'},$form->{'taskCategory'}) = prepare_fordb($form->{'taskSummary'},$form->{'taskDescription'},$form->{'taskCategory'}); db_insert('todo', { USER => $USER, SUMMARY => $form->{'taskSummary'}, INFO => $form->{'taskDescription'}, PRIORITY => $form->{'taskPriority'}, DUE_DATE => $form->{'taskDuedate'}, CATEGORY => $form->{'taskCategory'}, STATUS => 1 }); db_end(); unlock_tables(); $warning = tagged('b', {content => $trans->gettext('The task has been added to your todo-list.')}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].$trans->gettext('Task request').qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } sub reject_task { my $tasksender = $form->{'taskSender'}; ($tasksender) = prepare_fordb($tasksender); my ($warning); ($form->{'taskSummary'},$form->{'taskCategory'}) = prepare_fordb($form->{'taskSummary'},$form->{'taskCategory'}); if (!db_select('TYPE','messages', "TYPE = 'TODO' and SENDER = '$tasksender' and TARGET = '$USER' and MESSAGE like '$form->{'taskDuedate'}/$form->{'taskPriority'}/$form->{'taskCategory'}/$form->{'taskSummary'}/%'")) {$warning = tagged('div',{class => 'error', content => $trans->gettext('Don\'t hax0r!')});} else { my ($nimi, $targetDB); lock_tables('READ', 'users'); db_list("select nimi,UID from users where nimi = '$tasksender'"); while (my $ref = $sth->fetchrow_hashref()) {$nimi = $ref->{'nimi'}; $targetDB = "$ref->{'UID'}_messages";} db_end(); unlock_tables(); lock_tables('WRITE', 'messages', $targetDB); my $time = time(); db_delete('messages',"TYPE = 'TODO' and SENDER = '$tasksender' and TARGET = '$USER' and MESSAGE like '$form->{'taskDuedate'}/$form->{'taskPriority'}/$form->{'taskCategory'}/$form->{'taskSummary'}/%'"); my $time = time(); my $message = sprintf($trans->gettext('[B]I have rejected the task "%s"[/B]'),$form->{'taskSummary'}); db_insert($targetDB, {folder => 'Inbox', sender => $USER, target => $tasksender, 'time' => time, status => 'Not read', message => $message}); db_end(); unlock_tables(); $warning = tagged('b', {content => sprintf($trans->gettext('A rejection message has been sent to %s.'),$tasksender)}); } $ref = get_template("$config{'theme'}_shortmessage"); my $fulltemplate = $ref->{"$config{'theme'}_shortmessage"}; my $topic = qq[].$trans->gettext('Task request').qq[]; $fulltemplate =~ s/<>/$topic/ms; $fulltemplate =~ s/<>/$close/ms; $fulltemplate =~ s/<>/$warning/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); print_header('pragma'); print $fulltemplate; db_end('disconnect'); exit; } ################################################################# # THE CALENDAR FUNCTIONS (needed for the event sharing stuff): # ################################################################# sub floor { my $number = shift; if ($number >= 0) { return int($number); } else { return int($number-1); } # negatiivisilla luvuilla pelkkä int-pyöristys ei toimi } sub day_num { my ($day,$month,$year) = @_; return (365*$year + $day + 31*($month-1) + floor(($year-1)/4) - floor(3*floor((($year-1)/100)+1)/4)) if ($month == 1 || $month == 2); return (365*$year + $day + 31*($month-1) - floor(0.4*$month + 2.3) + floor($year/4) - floor (3*(floor($year/100)+1)/4)); } sub day_of_the_week { my ($day,$month,$year) = @_; return (7+(day_num($day,$month,$year) + 7*floor(day_num($day,$month,$year)/(-7)))); }