#!/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: shortmsg.html,v 1.13 2002/07/14 09:07:24 inf Exp $ #"""""""""""""""""""""""""""""""""""""""""# # # # MimerDesk: short message system # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # (c) Ionstream Oy 1999 - 2001 # # # # Programmed by: Hannes Muurinen # # # #_________________________________________# use lib::MimerDesk; use strict; use vars qw($form $APPLICATION $USER $IP $LAST_ACT $FORWARDED $TIME_USED $IDLE $no_year_given $colors $actionmessage $myID $myDB $trans $cut_message_length $trashcan_name @default_folders %default_descending_sort); use CGI::Carp "fatalsToBrowser"; sub print_template; read_config('../config/mimerdesk.cfg'); $config{'theme'} = 'default'; $APPLICATION = 'Communication - Short messages'; $cut_message_length = 45; # number of letters in the preview $trashcan_name = 'Trash can'; # name of the trash can @default_folders = ('Send message', 'Inbox', 'Outbox', 'Drafts', 'Trash can'); %default_descending_sort = ('time' => '1', 'sender' => '0', 'target' => '0', 'status' => '0'); # The main program ################### $colors = initialize('colors'); $form = decode_multipart(); $form->{'ID'} =~ tr/0-9//cd; $form->{'auth'} =~ tr/0-9a-z//cd; #default values: #$form->{'folder'} = 'Inbox' if $form->{'folder'} eq ''; $form->{'navigation'} = 'Send message' if $form->{'navigation'} eq ''; if($form->{'order'} eq '') { $form->{'order'} = 'time'; $form->{'descend'} = '1'; } ($USER, $IP, $LAST_ACT, $FORWARDED, $TIME_USED, $IDLE) = authenticate($form->{'ID'}, $form->{'auth'}); $trans = lib::MimerDesk->new_gettext(program => 'shortmsg',language => $config{'language'}); $APPLICATION = $trans->gettext('Communication - Short messages'); #get the user id lock_tables('READ', 'users'); my($ref) = db_select('UID','users',"nimi = '$USER'"); $myID = $ref->{'UID'}; db_end(); unlock_tables(); $myDB = "${myID}_messages"; # the user's table name fetch_forward_stuff() if($form->{'forward'} and $form->{'messageID'}); $actionmessage = ''; $actionmessage .= send_message() if $form->{'send'}; $actionmessage .= save_draft() if $form->{'draft'}; $actionmessage .= delete_messages() if $form->{'deletemsg'}; $actionmessage .= empty_trash_can() if $form->{'empty_trash_can'}; # Message database adding scripts: #db_list("select UID,nimi from users order by UID"); #while (my $ref = $sth->fetchrow_hashref()) #{ # change_column("$ref->{'UID'}_messages",'time','int unsigned NULL'); # change_column("$ref->{'UID'}_messages",'target','text not null'); # drop_table("$ref->{'UID'}_messages"); # create_table("$ref->{'UID'}_messages","IDnumber INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, # folder varchar(20) binary not NULL default 'Inbox', # sender varchar(15) binary not null, # target varchar(70) binary not null, # time varchar(30) NULL, # status varchar(30) NULL, # message text NULL"); #} #db_end(); if($form->{'navigation'} eq 'Send message') {print_template("$config{'theme'}_shortmsg");} else {print_template("$config{'theme'}_shortmsg_list");} # Subs: ########### # print_template # # sub print_template { my ($template, $ref, $fulltemplate, $calendar, $navigation_right, $calinfo, $navigation_left); $template = shift; print_header('pragma'); $ref = get_template('maintemplate',$template); $ref->{'maintemplate'} =~ s/<>/$ref->{$template}/m; $fulltemplate = $ref->{'maintemplate'}; $fulltemplate = create_buttons($fulltemplate, 'Communication', 'Messages', $form); $fulltemplate =~ s/<>/minea/gm; $ref = get_template('js_doClock', 'js_help', 'js_gotosite'); my $stuff = $ref->{'js_doClock'}.$ref->{'js_help'}.$ref->{'js_gotosite'}; $fulltemplate =~ s/<>/$stuff/ms; $fulltemplate =~ s/<>/MimerDesk\: $APPLICATION/ms; # if ($form->{'addproduct'}) {$fulltemplate = replace_add_prod_tags($fulltemplate);} # elsif ($form->{'showproducts'}) {$fulltemplate = replace_info_tags($fulltemplate);} # elsif ($form->{'addcategory'}) {$fulltemplate = replace_add_category_tags($fulltemplate);} # else {$fulltemplate = replace_category_tags($fulltemplate);} if($form->{'navigation'} eq 'Send message') {$fulltemplate = replace_messagesend_tags($fulltemplate);} else {$fulltemplate = replace_messagelist_tags($fulltemplate);} $fulltemplate =~ s/<>/$actionmessage/; my @dropitems = @default_folders; my %dropvalues = ('Send message' => $trans->gettext('Send message'), 'Inbox' => $trans->gettext('Inbox'), 'Outbox' => $trans->gettext('Outbox'), 'Drafts' => $trans->gettext('Drafts'), 'Trash can' => $trans->gettext('Trash can')); my %dropargs = (name => 'navigation', order => \@dropitems, 'values' => \%dropvalues, default => $form->{'navigation'}, onChange => 'return change_page();' ); my $stuff = dropdownmenu(%dropargs); $fulltemplate =~ s/<>/$stuff/gm; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); $fulltemplate = add_popups($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}); print $fulltemplate; db_end('disconnect'); exit; } ################################################################################# # replace_messagesend_tags - replaces the tags in the message send template # #-------------------------------------------------------------------------------# # replace_messagesend_tags($HTML_template) # # # # other arguments are read from the form # # # # Usage: # # $HTML_template = replace_messagesend_tags($HTML_template) # # # ################################################################################# sub replace_messagesend_tags { my $the_template = shift; my @dropitems = (''); my %dropvalues = ('' => $trans->gettext('[ Select user from My Friends ]')); # Old -- all users were fetched: # my %dropvalues = ('' => '[ Select user ]'); # lock_tables('READ', 'users'); # db_list("select nimi from users order by nimi"); # while (my $ref = $sth->fetchrow_hashref()) # { # push(@dropitems, $ref->{'nimi'}); # $dropvalues{$ref->{'nimi'}} = $ref->{'nimi'}; # } # db_end(); # unlock_tables(); # New -- users are fetched from the personal friend list: lock_tables('READ', 'friends','users'); db_list("select users.nimi,users.info from users,friends where friends.user = '$USER' and users.nimi = friends.friend order by users.nimi"); while (my $ref = $sth->fetchrow_hashref()) { push(@dropitems, $ref->{'nimi'}); $dropvalues{$ref->{'nimi'}} = "$ref->{'nimi'} ($ref->{'info'})"; } db_end(); unlock_tables(); my %dropargs = (name => 'target_user', order => \@dropitems, 'values' => \%dropvalues, default => $form->{'target_user'} ); my $stuff = dropdownmenu(%dropargs). tagged('font', {class => 'content', content => $trans->gettext(' or send to user: ')}). textfield(name => 'target_user_text', value => $form->{'target_user_text'}, size => 20); $the_template =~ s/<>/$stuff/gm; @dropitems = (''); %dropvalues = ('' => $trans->gettext('[ Select group from My Groups ]')); lock_tables('READ', 'groups', 'groupusers'); db_list("select groups.GRPNAME from groups,groupusers where groups.GID = groupusers.GID and groupusers.USER = '$USER' order by groups.GRPNAME"); while (my $ref = $sth->fetchrow_hashref()) { push(@dropitems, $ref->{'GRPNAME'}); $dropvalues{$ref->{'GRPNAME'}} = $ref->{'GRPNAME'}; } db_end(); unlock_tables(); my %dropargs = (name => 'target_group', order => \@dropitems, 'values' => \%dropvalues, default => $form->{'target_group'} ); my $stuff = dropdownmenu(%dropargs). tagged('font', {class => 'content', content => $trans->gettext(' or send to group: ')}). textfield(name => 'target_group_text', value => $form->{'target_group_text'}, size => 20); $the_template =~ s/<>/$stuff/gm; $the_template =~ s/<>/$form->{'message'}/; return $the_template; } ################################################################################# # replace_messagelist_tags - replaces the tags in the message list template # #-------------------------------------------------------------------------------# # replace_messagelist_tags($HTML_template) # # # # other arguments are read from the form # # # # Usage: # # $HTML_template = replace_messagelist_tags($HTML_template) # # # ################################################################################# sub replace_messagelist_tags { my $the_template = shift; my ($fullpreview2, $deletemessage, $deletebutton, $alttext, $button_JS_function, $full_preview_stuff, $short_preview_stuff); my $trans_folder_text = $trans->gettext($form->{'folder'}); # folder values are defined in the po-file $the_template =~ s/<>/$trans_folder_text/gm; $the_template =~ s/<>/$form->{'folder'}/gm; #generate the double sorting links (clicking second time the link sorts backwards): foreach('time','sender','target','status') { my($sort_descending); if($form->{'order'} eq $_) { $sort_descending = !$form->{'descend'}; } else { $sort_descending = $default_descending_sort{$_}; } $the_template =~ s/<<${_}_desc>>/$sort_descending/gm; } $the_template =~ s/<>/$form->{'descend'}/gm; my ($some_stuff,$num_of_msgs) = generate_messagelist_table(); $the_template =~ s/<>/$some_stuff/gm; $the_template =~ s/<>/$num_of_msgs/gm; $the_template =~ s/<>/$form->{'order'}/gm; if($form->{'fullpreview'}) { $fullpreview2 = 0; $full_preview_stuff = $trans->gettext('Full'); $short_preview_stuff = tag('a',{href => "shortmsg.html?ID=$form->{'ID'}&auth=$form->{'auth'}&folder=$form->{'folder'}&navigation=$form->{'navigation'}&order=$form->{'order'}&fullpreview=0", onMouseOver => 'doClock(); return true', class=> 'grayTitleLink'}) . $trans->gettext('Short') . endtag('a'); } else { $fullpreview2 = 1; $full_preview_stuff = tag('a',{href => "shortmsg.html?ID=$form->{'ID'}&auth=$form->{'auth'}&folder=$form->{'folder'}&navigation=$form->{'navigation'}&order=$form->{'order'}&fullpreview=1", onMouseOver => 'doClock(); return true', class=> 'grayTitleLink'}) . $trans->gettext('Full') . endtag('a'); $short_preview_stuff = $trans->gettext('Short'); } $the_template =~ s/<>/$full_preview_stuff/gm; $the_template =~ s/<>/$short_preview_stuff/gm; $the_template =~ s/<>/$form->{'fullpreview'}/gm; $the_template =~ s/<>/$fullpreview2/gm; if($form->{'folder'} eq $trashcan_name) { $deletemessage = $trans->gettext('Do you really want to empty the trash can?'); $deletebutton = 'emptytrashcan.gif'; $alttext = $trans->gettext('Empty trash can'); $button_JS_function = 'javascript:EMPTY_TRASH()'; } else { $deletemessage = $trans->gettext('Do you really want to move the selected message(s) to trash can?'); $deletebutton = 'movetotrashcan.gif'; $alttext = $trans->gettext('Move message(s) to trash can'); $button_JS_function = 'javascript:KILL()'; } $some_stuff = tag('a',{href => 'javascript:KILL_PERMANENTLY()', onMouseOver => 'doClock(); return true', class=> 'contentLink', onClick => "return confirm('Do you really want to delete the selected message(s) permanently?');"}) . image(src => "<>delete.gif", border => '0', alt => 'Delete message(s) permanently', align => 'absmiddle') . endtag('a') . ' '. tag('a',{href => $button_JS_function, onMouseOver => 'doClock(); return true', class=> 'contentLink', onClick => "return confirm('$deletemessage');"}) . image(src => "<>$deletebutton", border => '0', alt => $alttext, align => 'absmiddle') . endtag('a'); $the_template =~ s/<>/$some_stuff/gm; return $the_template; } ################################################################################# # generate_messagelist_table - fetches the message stuff from the db # #-------------------------------------------------------------------------------# # generate_messagelist_table() # # # # arguments (folder etc.) are read from the form # # # # Usage: # # ($HTML_stuff,$number_of_messages) = generate_messagelist_table() # # # ################################################################################# sub generate_messagelist_table { my ($number_of_messages, $HTML_table) = (0,''); my $desc; my %translated_status = ('Draft' => $trans->gettext('Draft'), 'Not read' => $trans->gettext('Not read'), 'Read' => $trans->gettext('Read'), 'Sent' => $trans->gettext('Sent') ); $desc = ' DESC' if $form->{'descend'}; lock_tables('READ',$myDB); db_list("select * from $myDB where folder = '$form->{'folder'}' order by $form->{'order'}$desc"); while (my $ref = $sth->fetchrow_hashref()) { my ($printed_message, $linkhref); my @datearray = utc_epoch2date($ref->{'time'}); $ref->{'message'} =~ s/\n/
/gm; my $cut_message = itag_remover($ref->{'message'}); $ref->{'message'} = itag_replacer($ref->{'message'}); $cut_message = substr($cut_message,0,$cut_message_length); $cut_message .= '...' if $cut_message ne $ref->{'message'}; if($form->{'folder'} eq 'Drafts') { $linkhref = "shortmsg.html?ID=$form->{'ID'}&auth=$form->{'auth'}&messageID=$ref->{'IDnumber'}&forward=true";} else { $linkhref = "javascript:popItMsg('messageID=$ref->{'IDnumber'}',430,400,'$ref->{'IDnumber'}');";} if($form->{'fullpreview'}) {$printed_message = tag('a',{href => $linkhref, onMouseOver => 'doClock(); return true', class=> 'contentLink'}) . $ref->{'message'} . endtag('a');} else {$printed_message = tag('a',{href => $linkhref, onMouseOver => 'doClock(); return true', class=> 'contentLink'}) . "$cut_message" . endtag('a');} $HTML_table .= startrow(bgcolor => '#FFFFFF', class => 'content', align => 'left'). column(valign => 'top', class => 'content', content => "$datearray[5]/$datearray[4]/$datearray[3] $datearray[2]:$datearray[1]"). column(valign => 'top', class => 'content', content => tagged('a', {href => "profile_view.html?ID=$form->{'ID'}&auth=$form->{'auth'}&showprofile=$ref->{'sender'}", onMouseOver => 'doClock(); return true', class=> 'contentLink', content => $ref->{'sender'}}).' '). column(valign => 'top', class => 'content', content => tagged('a', {href => "profile_view.html?ID=$form->{'ID'}&auth=$form->{'auth'}&showprofile=$ref->{'target'}", onMouseOver => 'doClock(); return true', class=> 'contentLink', content => $ref->{'target'}}).' '). column(valign => 'top', class => 'content', content => "$printed_message "). column(valign => 'top', class => 'content', content => "$translated_status{$ref->{'status'}} "). column(valign => 'top', class => 'content', align => "center", content => checkbox(name => "delcheckbox_$number_of_messages", value => $ref->{'IDnumber'})). endrow(); $number_of_messages++; } db_end(); unlock_tables(); $HTML_table = startrow(bgcolor => '#FFFFFF', class => 'content', align => 'left'). column(content => $trans->gettext("No messages in this folder"), colspan => "6"). endrow() if $HTML_table eq ''; return ($HTML_table,$number_of_messages); } ################################################################################# # send_message - sends message to user # #-------------------------------------------------------------------------------# # send_message() # # # # arguments are read from the form # # # # Usage: # # $message = send_message() # # # ################################################################################# sub send_message { my ($targetID, $targetDB, $returnmessage, @sendlist, $the_target); if(($form->{'target_user'} or $form->{'target_user_text'} or $form->{'target_group'} or $form->{'target_group_text'}) and $form->{'message'} and length($form->{'message'}) <= 800) { my $user_checklist = ','; if ($form->{'target_user_text'}) { push @sendlist, (split /, /, $form->{'target_user_text'}); # add the written users to list $user_checklist .= (join ",", @sendlist) . ','; } if ($form->{'target_user'} and $user_checklist !~ /,$form->{'target_user'},/) { push @sendlist, $form->{'target_user'}; # add the individual selected user to list $user_checklist .= "$form->{'target_user'},"; } my @grouplist = (split /, /, $form->{'target_group_text'}); push @grouplist, $form->{'target_group'} if($form->{'target_group'}); foreach(@grouplist) # add group members to list { my $is_valid_group_name; lock_tables('READ', 'groups','groupusers'); db_list("select groupusers.USER from groups,groupusers where groups.GRPNAME = '$_' and groups.GID = groupusers.GID"); while (my $ref = $sth->fetchrow_hashref()) { push @sendlist, $ref->{'USER'} if ($user_checklist !~ /,$ref->{'USER'},/ and $ref->{'USER'} ne $USER); $user_checklist .= "$ref->{'USER'},"; $is_valid_group_name = 'true'; } db_end(); unlock_tables(); return tag('div',{class => 'error'}). $trans->gettext("Invalid group name ")."'$_'!". endtag('div'). tag('br') if !$is_valid_group_name; } my $time = time; $user_checklist =~ s/^,//; $user_checklist =~ s/,$//; $user_checklist =~ s/,/, /sgm; my %db = ( folder => 'Inbox', sender => $USER, target => $user_checklist, 'time' => $time, status => 'Not read', message => $form->{'message'} ); my $list_who_sent; foreach(@sendlist) { #get the user ids lock_tables('READ', 'users'); my($ref) = db_select('UID','users',"nimi = '$_'"); $targetID = $ref->{'UID'}; db_end(); unlock_tables(); my $sent_message_trans; if ($list_who_sent and !$ref->{'UID'}) { $sent_message_trans = $trans->gettext("The message was sent to the following users: ").$list_who_sent; $sent_message_trans =~ s/,$//; } return tag('div',{class => 'error'}). sprintf($trans->gettext('Invalid user "%s"!'),$_). tag('br').$sent_message_trans. endtag('div'). tag('br') if(!$ref->{'UID'}); $targetDB = "${targetID}_messages"; $list_who_sent .= "$_ ,"; $db{'target'} = $_; db_insert($targetDB,\%db); } $list_who_sent =~ s/^,//; $list_who_sent =~ s/,$//; $list_who_sent =~ s/,/, /sgm; $db{'folder'} = 'Outbox'; $db{'status'} = 'Sent'; $db{'target'} = $list_who_sent; db_insert($myDB,\%db); $returnmessage = tag('div',{class => 'success'}). $trans->gettext("The message was sent to the following users: ").$list_who_sent. endtag('div'). tag('br'). $returnmessage if $list_who_sent; $form->{'target_user'} = ''; $form->{'target_group'} = ''; $form->{'target_user_text'} = ''; $form->{'target_group_text'} = ''; $form->{'message'} = ''; } else { $returnmessage = ''; my $excesslength = length($form->{'message'})-800; $returnmessage .= tag('div',{class => 'error'}). $trans->gettext("You must select user or group!"). endtag('div'). tag('br') if (!$form->{'target_user'} and !$form->{'target_group'} and !$form->{'target_user_text'} and !$form->{'target_group_text'}); $returnmessage .= tag('div',{class => 'error'}). $trans->gettext("You must write a message!"). endtag('div'). tag('br') if !$form->{'message'}; $returnmessage .= tag('div',{class => 'error'}). sprintf($trans->gettext("The message is too long! You must remove %s characters."),$excesslength). endtag('div'). tag('br') if $excesslength > 0; } return $returnmessage; } ################################################################################# # save_draft - saves message for further modifying # #-------------------------------------------------------------------------------# # save_draft() # # # # arguments are read from the form # # # # Usage: # # $message = save_draft() # # # ################################################################################# sub save_draft { my ($returnmessage); if($form->{'message'} and length($form->{'message'}) <= 800) { my $time = time; my %db = ( folder => 'Drafts', sender => $USER, target => $form->{'target_user'}, 'time' => $time, status => 'Draft', message => $form->{'message'} ); db_insert($myDB,\%db); $returnmessage = tagged('div',{class => 'success', content => $trans->gettext("The message was saved to your draft folder.")}). tag('br'); } else { $returnmessage = ''; my $excesslength = length($form->{'message'})-800; $returnmessage .= tagged('div',{class => 'error', content => $trans->gettext("You must write a message!")}). tag('br') if !$form->{'message'}; $returnmessage .= tagged('div',{class => 'error', content => sprintf($trans->gettext("The message is too long! You must remove %s characters."),$excesslength)}). tag('br') if $excesslength > 0; } return $returnmessage; } ######################################################################### # delete_messages - removes the selected messages. # #-----------------------------------------------------------------------# # # # returns error/success messages. # # # ######################################################################### sub delete_messages { my ($check, $message) = ('',''); my %updb = (folder => $trashcan_name); for(my $i=0; $i < $form->{'number_of_messages'}; $i++) { if($form->{"delcheckbox_$i"}) #if the checkbox is checked, do the stuff: { if($form->{'delete_permanently'}) { db_delete($myDB, "IDnumber = '".$form->{"delcheckbox_$i"}."'"); $check .= 'deleted'; } else { db_update($myDB, \%updb, "IDnumber = '".$form->{"delcheckbox_$i"}."' and folder != '$trashcan_name'"); $check .= 'moved'; } } } if(!$check) { $message = tagged('div',{class => 'error', content => $trans->gettext("No messages selected!") });} else { if($form->{'delete_permanently'}) { $message = tagged('div',{class => 'success', content => $trans->gettext("Message(s) deleted permanently!") }); } else { $message = tagged('div',{class => 'success', content => $trans->gettext("Message(s) moved to Trash can!")}); } } return $message; } ######################################################################### # empty_trash_can - removes the messages in trash can. # #-----------------------------------------------------------------------# # # # returns error/success messages. # # # ######################################################################### sub empty_trash_can { lock_tables('WRITE', $myDB); db_delete($myDB, "folder = '$trashcan_name'"); unlock_tables(); return tagged('div',{class => 'success', content => $trans->gettext("The trash can has been emptied") }); } ######################################################################### # fetch_forward_stuff - fetches stuff from the database # #-----------------------------------------------------------------------# # # # modifies $form -hash # # # ######################################################################### sub fetch_forward_stuff { lock_tables('READ', $myDB); my($ref) = db_select('*',$myDB,"IDnumber = '$form->{'messageID'}'"); $form->{'target_user'} = $ref->{'target'}; $form->{'message'} = $ref->{'message'}; if($ref->{'sender'} ne $USER) { $form->{'message'} = sprintf($trans->gettext('[B]%s [/B]:\n[QUOTE]%s [/QUOTE]\n'),$ref->{'sender'},$form->{'message'}); } db_end(); unlock_tables(); }