aboutsummaryrefslogblamecommitdiffstats
path: root/mod/message.php
blob: 34aee10a8e6f77ca66f966a3832385a2c6c1bf93 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

     
                                          
                                    
 
                            
                        


                                                                
                                           






                                                       

                                  



                                       
                                       
                                        
                            



                                                       
           
 



         


        
                            
 



                                                       
 


                                                                                              
                                                                                              
 
                                                      
                                          
         
        
                                                                                 
                         



                                                                    
                                        





                                                                                   



                                                                         

                                                         
         
 






                                                                      
 
 




















                                                                                                     
                                                                                                                                     
                                                                                                                    

                               





















                                                                                                             

                          





                                                                                          





                                                                                                                                
         
                                        





                                                                                                   
                                                                                                               







                        
                               

                
                                     





                                                       
                                                                                
 
                                                    

                                             
                                              


           

                                                                             
                               
                               
                                     

                                                                                                
                                                    

                                
                                                                    
                         
                                                                    

                      

                                                                                                             
                                                    

                                       
                                                              
 

                                                                                                           
                                                       
                                                            
                                  
 
                                      
                                                                                 
                          
                                                                    


                        
 


                                                     
                

                              


                                                                          

                                                              
 
                                                             
 
                                                                   
                                                            
                                                                                                       
                                                                
                                                                   

                   
                                                                           
                        
 
                                                 
 
                                

                                                                                                              
                                                     
                                               
                          



                                                               

                         
 
                                                           
 


                                                                                                                 
 
                                                              
                                                

                                                               
                                                 


                                                 
                                                    

                                                                                                                   
                                          

                                                             
                                        

                                                          

                                                    




                          
                         

                                

                              
 
                
                                                               

                                               
                  
                      
                                                            
 
                                                                                                     
                                             


                                                      
                          
                                                       
                                  

                 











                                                                                                
                                                            
                                    



                                                                                 

                                                         







                                                                                                                                        
                                                                        

                                                                                                                                     



                                        

         
                                               


                              
                                                                                               
                                             
                                       
                  


                                                             
                                  

                 
                                                                                                                    
                                                   
                                            

                  

























                                                                                                                                                

                                                   
                                                             
        
                                                                   
                                                                
                                                           
                   

 

                                 

                                 
                                                


                                                                                          
 
                                             
 


                                                                                                                                                   
 

                                                       





                                                                                                         


                                                                                             

                                                                                                                                     
                                
                                                 
 
                 
 


                                                                                                            
 
                                                                                                                                                   
                                                                                                          






                                                               

                                                                                                                                                                                        


                                           

                                                     
                                            
                                                    
                                                                         

                                                                                            
                                      



                                                          
                                                 
                                                   
 




                          
 
<?php

require_once('include/acl_selectors.php');
require_once('include/message.php');

function message_init(&$a) {
	$tabs = array();
	$new = array(
		'label' => t('New Message'),
		'url' => $a->get_baseurl(true) . '/message/new',
		'sel'=> (argv(1) == 'new'),
	);
	
	$tpl = get_markup_template('message_side.tpl');
	$a->page['aside'] = replace_macros($tpl, array(
		'$tabs'=>$tabs,
		'$new'=>$new,
	));
	$base = $a->get_baseurl();

	$a->page['htmlhead'] .= <<< EOT

<script>$(document).ready(function() { 
	var a; 
	a = $("#recip").autocomplete({ 
		serviceUrl: '$base/acl',
		minChars: 2,
		width: 350,
		onSelect: function(value,data) {
			$("#recip-complete").val(data);
		}			
	});

}); 

</script>
EOT;
	
}

function message_post(&$a) {

	if(! local_user()) {
		notice( t('Permission denied.') . EOL);
		return;
	}

	$replyto   = ((x($_REQUEST,'replyto'))   ? notags(trim($_REQUEST['replyto']))   : '');
	$subject   = ((x($_REQUEST,'subject'))   ? notags(trim($_REQUEST['subject']))   : '');
	$body      = ((x($_REQUEST,'body'))      ? escape_tags(trim($_REQUEST['body'])) : '');
	$recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');

	if(feature_enabled(local_user(),'richtext')) {
		$body = fix_mce_lf($body);
	}
	
	$ret = send_message(local_user(), $recipient, $body, $subject, $replyto);
	$norecip = false;

	switch($ret){
		case -1:
			notice( t('No recipient selected.') . EOL );
			$norecip = true;
			break;
		case -2:
			notice( t('Unable to locate contact information.') . EOL );
			break;
		case -3:
			notice( t('Message could not be sent.') . EOL );
			break;
		case -4:
			notice( t('Message collection failure.') . EOL );
			break;
		default:
			info( t('Message sent.') . EOL );
	}

	// fake it to go back to the input form if no recipient listed

	if($norecip) {
		$a->argc = 2;
		$a->argv[1] = 'new';
	}

}

// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
// is identical to the code in include/conversation.php
if(! function_exists('item_extract_images')) {
function item_extract_images($body) {

	$saved_image = array();
	$orig_body = $body;
	$new_body = '';

	$cnt = 0;
	$img_start = strpos($orig_body, '[img');
	$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
	$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
	while(($img_st_close !== false) && ($img_end !== false)) {

		$img_st_close++; // make it point to AFTER the closing bracket
		$img_end += $img_start;

		if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) {
			// This is an embedded image

			$saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close));
			$new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]';

			$cnt++;
		}
		else
			$new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]'));

		$orig_body = substr($orig_body, $img_end + strlen('[/img]'));

		if($orig_body === false) // in case the body ends on a closing image tag
			$orig_body = '';

		$img_start = strpos($orig_body, '[img');
		$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
		$img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
	}

	$new_body = $new_body . $orig_body;

	return array('body' => $new_body, 'images' => $saved_image);
}}

if(! function_exists('item_redir_and_replace_images')) {
function item_redir_and_replace_images($body, $images, $cid) {

	$origbody = $body;
	$newbody = '';

	for($i = 0; $i < count($images); $i++) {
		$search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
		$replace = '[url=' . z_path() . '/redir/' . $cid 
		           . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;

		$img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
		$process_part = substr($origbody, 0, $img_end);
		$origbody = substr($origbody, $img_end);

		$process_part = preg_replace($search, $replace, $process_part);
		$newbody = $newbody . $process_part;
	}
	$newbody = $newbody . $origbody;

	$cnt = 0;
	foreach($images as $image) {
		// We're depending on the property of 'foreach' (specified on the PHP website) that
		// it loops over the array starting from the first element and going sequentially
		// to the last element
		$newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
		$cnt++;
	}

	return $newbody;
}}



function message_content(&$a) {

	$o = '';
	nav_set_selected('messages');

	if(! local_user()) {
		notice( t('Permission denied.') . EOL);
		return;
	}

	$myprofile = $a->get_baseurl(true) . '/channel/' . $a->user['nickname'];

	$tpl = get_markup_template('mail_head.tpl');
	$header = replace_macros($tpl, array(
		'$messages' => t('Messages'),
		'$tab_content' => $tab_content
	));


	if((argc() == 3) && (argv(1) === 'drop' || argv(1) === 'dropconv')) {
		if(! intval(argv(2)))
			return;
		$cmd = argv(1);
		if($cmd === 'drop') {
			$r = q("DELETE FROM `mail` WHERE `id` = %d AND channel_id = %d LIMIT 1",
				intval(argv(2)),
				intval(local_user())
			);
			if($r) {
				info( t('Message deleted.') . EOL );
			}
			goaway($a->get_baseurl(true) . '/message' );
		}
		else {
			$r = q("SELECT `parent_uri` FROM `mail` WHERE `id` = %d AND channel_id = %d LIMIT 1",
				intval(argv(2)),
				intval(local_user())
			);
			if(count($r)) {
				$parent = $r[0]['parent_uri'];


				$r = q("DELETE FROM `mail` WHERE `parent_uri` = '%s' AND channel_id = %d ",
					dbesc($parent),
					intval(local_user())
				);

				if($r)
					info( t('Conversation removed.') . EOL );
			} 
			goaway($a->get_baseurl(true) . '/message' );
		}	
	
	}

	$channel = $a->get_channel();

	if((argc() > 1) && ($a->argv[1] === 'new')) {
		
		$o .= $header;
		
		$plaintext = false;
		if(intval(get_pconfig(local_user(),'system','plaintext')))
			$plaintext = true;
		if(! feature_enabled(local_user(),'richtext'))
			$plaintext = true;

		$tpl = get_markup_template('msg-header.tpl');

		$a->page['htmlhead'] .= replace_macros($tpl, array(
			'$baseurl' => $a->get_baseurl(true),
			'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
			'$nickname' => $channel['channel_addr'],
			'$linkurl' => t('Please enter a link URL:')
		));
	
		$preselect = (isset($a->argv[2])?array($a->argv[2]):false);
			

		$prename = $preurl = $preid = '';

		if($preselect) {
			$r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
				where abook_channel = %d and abook_id = %d limit 1",
				intval(local_user()),
				intval(argv(2))
			);
			if($r) {
				$prename = $r[0]['xchan_name'];
				$preurl = $r[0]['xchan_url'];
				$preid = $r[0]['abook_id'];
			}
		}	 

		$prefill = (($preselect) ? $prename  : '');

		// the ugly select box
		
		$select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10);

		$tpl = get_markup_template('prv_message.tpl');
		$o .= replace_macros($tpl,array(
			'$header' => t('Send Private Message'),
			'$to' => t('To:'),
			'$showinputs' => 'true', 
			'$prefill' => $prefill,
			'$autocomp' => $autocomp,
			'$preid' => $preid,
			'$subject' => t('Subject:'),
			'$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
			'$text' => ((x($_REQUEST,'body')) ? escape_tags(htmlspecialchars($_REQUEST['body'])) : ''),
			'$readonly' => '',
			'$yourmessage' => t('Your message:'),
			'$select' => $select,
			'$parent' => '',
			'$upload' => t('Upload photo'),
			'$insert' => t('Insert web link'),
			'$wait' => t('Please wait'),
			'$submit' => t('Submit')
		));

		return $o;
	}

	if(argc() == 1) {

		// list messages

		$o .= $header;

		
		$r = q("SELECT count(*) AS `total` FROM `mail` 
			WHERE channel_id = %d",
			intval(local_user())
		);
		if($r)
			$a->set_pager_total($r[0]['total']);

		$r = q("SELECT * from mail WHERE channel_id = %d order by created desc limit %d, %d",
			intval(local_user()),
			intval($a->pager['start']),
			intval($a->pager['itemspage'])
		);
		if(! $r) {
			info( t('No messages.') . EOL);
			return $o;
		}

		$chans = array();
		foreach($r as $rr) {
			$s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
			if(! in_array($s,$chans))
				$chans[] = $s;
			$s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
			if(! in_array($s,$chans))
				$chans[] = $s;
 		}

		$c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");
		
		$tpl = get_markup_template('mail_list.tpl');
		foreach($r as $rr) {
			$rr['from'] = find_xchan_in_array($rr['from_xchan'],$c);
			$rr['to']   = find_xchan_in_array($rr['to_xchan'],$c);
			$rr['seen'] = (($rr['mail_flags'] & MAIL_SEEN) ? 1 : "");

			$o .= replace_macros($tpl, array(
				'$id' => $rr['id'],
				'$from_name' => template_escape($rr['from']['xchan_name']),
				'$from_url' =>  z_root() . '/chanview/?f=&hash=' . $rr['from_xchan'],
				'$from_photo' => $rr['from']['xchan_photo_s'],
				'$to_name' => template_escape($rr['to']['xchan_name']),
				'$to_url' =>  z_root() . '/chanview/?f=&hash=' . $rr['to_xchan'],
				'$to_photo' => $rr['to']['xchan_photo_s'],
				'$subject' => template_escape((($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>')),
				'$delete' => t('Delete message'),
				'$body' => template_escape($rr['body']),
				'$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
				'$seen' => $rr['seen']
			));
		}
		$o .= paginate($a);	
		return $o;
	}

	if((argc() > 1) && (intval(argv(1)))) {

		$o .= $header;

		$r = q("SELECT parent_uri from mail WHERE channel_id = %d and id = %d limit 1",
			intval(local_user()),
			intval(argv(1))
		);

		if(! $r) {
			info( t('Message not found.') . EOL);
			return $o;
		}

		$messages = q("select * from mail where parent_uri = '%s' and channel_id = %d order by created asc",
			dbesc($r[0]['parent_uri']),
			intval(local_user())
		);

		if(! $messages) {
			info( t('Message not found.') . EOL);
			return $o;
		}

		$chans = array();
		foreach($messages as $rr) {
			$s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
			if(! in_array($s,$chans))
				$chans[] = $s;
			$s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
			if(! in_array($s,$chans))
				$chans[] = $s;
 		}


dbg(1);
		$c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");

		$r = q("UPDATE `mail` SET mail_flags = (mail_flags ^ %d) where not (mail_flags & %d) and parent_uri = '%s' AND channel_id = %d",
			intval(MAIL_SEEN),
			intval(MAIL_SEEN),
			dbesc($r[0]['parent_uri']),
			intval(local_user())
		);
dbg(0);
		require_once("include/bbcode.php");

		$tpl = get_markup_template('msg-header.tpl');
	
		$a->page['htmlhead'] .= replace_macros($tpl, array(
			'$nickname' => $channel['channel_addr'],
			'$baseurl' => $a->get_baseurl(true)
		));


		$mails = array();
		$seen = 0;
		$unknown = false;

		foreach($messages as $message) {
			$message['from'] = find_xchan_in_array($message['from_xchan'],$c);
			$message['to']   = find_xchan_in_array($message['to_xchan'],$c);


logger('message: ' . print_r($message,true));

//			$extracted = item_extract_images($message['body']);
//			if($extracted['images'])
//				$message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']);

			$mails[] = array(
				'id' => $message['id'],
				'from_name' => template_escape($message['from']['xchan_name']),
				'from_url' =>  z_root() . '/chanview/?f=&hash=' . $message['from_xchan'],
				'from_photo' => $message['from']['xchan_photo_m'],
				'to_name' => template_escape($message['to']['xchan_name']),
				'to_url' =>  z_root() . '/chanview/?f=&hash=' . $message['to_xchan'],
				'to_photo' => $message['to']['xchan_photo_m'],
				'subject' => template_escape($message['title']),
				'body' => template_escape(smilies(bbcode($message['body']))),
				'delete' => t('Delete message'),
				'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'),
			);
				
			$seen = $message['seen'];

		}

		logger('mails: ' . print_r($mails,true));

		$recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to_xchan' : 'from_xchan');

		$select = $message[$recp]['xchan_name'] . '<input type="hidden" name="messageto" value="' . $message[$recp]['xchan_hash'] . '" />';
		$parent = '<input type="hidden" name="replyto" value="' . $message['parent_uri'] . '" />';

		$tpl = get_markup_template('mail_display.tpl');
		$o = replace_macros($tpl, array(
			'$thread_id' => $a->argv[1],
			'$thread_subject' => $message['title'],
			'$thread_seen' => $seen,
			'$delete' =>  t('Delete conversation'),
			'$canreply' => (($unknown) ? false : '1'),
			'$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),			
			'$mails' => $mails,
			
			// reply
			'$header' => t('Send Reply'),
			'$to' => t('To:'),
			'$showinputs' => '',
			'$subject' => t('Subject:'),
			'$subjtxt' => template_escape($message['title']),
			'$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
			'$yourmessage' => t('Your message:'),
			'$text' => '',
			'$select' => $select,
			'$parent' => $parent,
			'$upload' => t('Upload photo'),
			'$insert' => t('Insert web link'),
			'$submit' => t('Submit'),
			'$wait' => t('Please wait')

		));

		return $o;
	}

}