2014-06-28 14:59:48 -04:00
< ? php
/*******************************************************************************
* Title : Help Desk Software HESK
2015-06-23 23:33:03 -04:00
* Version : 2.6 . 4 from 22 nd June 2015
2014-06-28 14:59:48 -04:00
* Author : Klemen Stirn
* Website : http :// www . hesk . com
********************************************************************************
* COPYRIGHT AND TRADEMARK NOTICE
2015-02-22 22:17:38 -05:00
* Copyright 2005 - 2015 Klemen Stirn . All Rights Reserved .
2014-06-28 14:59:48 -04:00
* HESK is a registered trademark of Klemen Stirn .
* The HESK may be used and modified free of charge by anyone
* AS LONG AS COPYRIGHT NOTICES AND ALL THE COMMENTS REMAIN INTACT .
* By using this code you agree to indemnify Klemen Stirn from any
* liability that might arise from it ' s use .
* Selling the code for this program , in part or full , without prior
* written consent is expressly forbidden .
* Using this code , in part or full , to create derivate work ,
* new scripts or products is expressly forbidden . Obtain permission
* before redistributing this software over the Internet or in
* any other medium . In all cases copyright and header must remain intact .
* This Copyright is in full effect in any country that has International
* Trade Agreements with the United States of America or
* with the European Union .
* Removing any of the copyright notices without purchasing a license
* is expressly forbidden . To remove HESK copyright notice you must purchase
* a license for this script . For more information on how to obtain
* a license please visit the page below :
* https :// www . hesk . com / buy . php
*******************************************************************************/
define ( 'IN_SCRIPT' , 1 );
define ( 'HESK_PATH' , './' );
/* Get all the required files and functions */
require ( HESK_PATH . 'hesk_settings.inc.php' );
2015-08-19 07:46:52 -04:00
require ( HESK_PATH . 'modsForHesk_settings.inc.php' );
2014-06-28 14:59:48 -04:00
require ( HESK_PATH . 'inc/common.inc.php' );
2015-01-12 23:10:18 -05:00
// Are we in maintenance mode?
hesk_check_maintenance ();
2014-06-28 14:59:48 -04:00
hesk_load_database_functions ();
require ( HESK_PATH . 'inc/email_functions.inc.php' );
require ( HESK_PATH . 'inc/posting_functions.inc.php' );
2015-08-02 16:51:24 -04:00
require ( HESK_PATH . 'inc/htmLawed.php' );
2014-06-28 14:59:48 -04:00
// We only allow POST requests to this file
if ( $_SERVER [ 'REQUEST_METHOD' ] != 'POST' )
{
header ( 'Location: index.php' );
exit ();
}
// Check for POST requests larger than what the server can handle
if ( empty ( $_POST ) && ! empty ( $_SERVER [ 'CONTENT_LENGTH' ]) )
{
hesk_error ( $hesklang [ 'maxpost' ]);
}
hesk_session_start ();
/* A security check */
# hesk_token_check('POST');
$hesk_error_buffer = array ();
// Tracking ID
$trackingID = hesk_cleanID ( 'orig_track' ) or die ( $hesklang [ 'int_error' ] . ': No orig_track' );
// Email required to view ticket?
$my_email = hesk_getCustomerEmail ();
// Get message
$message = hesk_input ( hesk_POST ( 'message' ) );
// If the message was entered, further parse it
if ( strlen ( $message ) )
{
// Make links clickable
$message = hesk_makeURL ( $message );
// Turn newlines into <br />
$message = nl2br ( $message );
}
else
{
$hesk_error_buffer [] = $hesklang [ 'enter_message' ];
}
/* Attachments */
if ( $hesk_settings [ 'attachments' ][ 'use' ])
{
require ( HESK_PATH . 'inc/attachments.inc.php' );
$attachments = array ();
for ( $i = 1 ; $i <= $hesk_settings [ 'attachments' ][ 'max_number' ]; $i ++ )
{
$att = hesk_uploadFile ( $i );
if ( $att !== false && ! empty ( $att ))
{
$attachments [ $i ] = $att ;
}
}
}
$myattachments = '' ;
/* Any errors? */
if ( count ( $hesk_error_buffer ) != 0 )
{
$_SESSION [ 'ticket_message' ] = hesk_POST ( 'message' );
// If this was a reply after re-opening a ticket, force the form at the top
if ( hesk_POST ( 'reopen' ) == 1 )
{
$_SESSION [ 'force_form_top' ] = true ;
}
// Remove any successfully uploaded attachments
if ( $hesk_settings [ 'attachments' ][ 'use' ])
{
hesk_removeAttachments ( $attachments );
}
$tmp = '' ;
foreach ( $hesk_error_buffer as $error )
{
$tmp .= " <li> $error </li> \n " ;
}
$hesk_error_buffer = $tmp ;
$hesk_error_buffer = $hesklang [ 'pcer' ] . '<br /><br /><ul>' . $hesk_error_buffer . '</ul>' ;
hesk_process_messages ( $hesk_error_buffer , 'ticket.php?track=' . $trackingID . $hesk_settings [ 'e_param' ] . '&Refresh=' . rand ( 10000 , 99999 ));
}
/* Connect to database */
hesk_dbConnect ();
2015-02-22 22:17:38 -05:00
// Check if this IP is temporarily locked out
$res = hesk_dbQuery ( " SELECT `number` FROM ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " logins` WHERE `ip`=' " . hesk_dbEscape ( $_SERVER [ 'REMOTE_ADDR' ]) . " ' AND `last_attempt` IS NOT NULL AND DATE_ADD(`last_attempt`, INTERVAL " . intval ( $hesk_settings [ 'attempt_banmin' ]) . " MINUTE ) > NOW() LIMIT 1 " );
if ( hesk_dbNumRows ( $res ) == 1 )
{
if ( hesk_dbResult ( $res ) >= $hesk_settings [ 'attempt_limit' ])
{
unset ( $_SESSION );
hesk_error ( sprintf ( $hesklang [ 'yhbb' ], $hesk_settings [ 'attempt_banmin' ]) , 0 );
}
}
2014-06-28 14:59:48 -04:00
/* Get details about the original ticket */
$res = hesk_dbQuery ( " SELECT * FROM ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " tickets` WHERE `trackid`=' { $trackingID } ' LIMIT 1 " );
if ( hesk_dbNumRows ( $res ) != 1 )
{
hesk_error ( $hesklang [ 'ticket_not_found' ]);
}
$ticket = hesk_dbFetchAssoc ( $res );
/* If we require e-mail to view tickets check if it matches the one in database */
hesk_verifyEmailMatch ( $trackingID , $my_email , $ticket [ 'email' ]);
/* Ticket locked? */
if ( $ticket [ 'locked' ])
{
hesk_process_messages ( $hesklang [ 'tislock2' ], 'ticket.php?track=' . $trackingID . $hesk_settings [ 'e_param' ] . '&Refresh=' . rand ( 10000 , 99999 ));
exit ();
}
2015-02-22 22:17:38 -05:00
// Prevent flooding ticket replies
$res = hesk_dbQuery ( " SELECT `staffid` FROM ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " replies` WHERE `replyto`=' { $ticket [ 'id' ] } ' AND `dt` > DATE_SUB(NOW(), INTERVAL 10 MINUTE) ORDER BY `id` ASC " );
if ( hesk_dbNumRows ( $res ) > 0 )
{
$sequential_customer_replies = 0 ;
while ( $tmp = hesk_dbFetchAssoc ( $res ))
{
$sequential_customer_replies = $tmp [ 'staffid' ] ? 0 : $sequential_customer_replies + 1 ;
}
if ( $sequential_customer_replies > 10 )
{
hesk_dbQuery ( " INSERT INTO ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " logins` (`ip`, `number`) VALUES (' " . hesk_dbEscape ( $_SERVER [ 'REMOTE_ADDR' ]) . " ', " . intval ( $hesk_settings [ 'attempt_limit' ] + 1 ) . " ) " );
hesk_error ( sprintf ( $hesklang [ 'yhbr' ], $hesk_settings [ 'attempt_banmin' ]) , 0 );
}
}
2014-06-28 14:59:48 -04:00
/* Insert attachments */
if ( $hesk_settings [ 'attachments' ][ 'use' ] && ! empty ( $attachments ))
{
foreach ( $attachments as $myatt )
{
hesk_dbQuery ( " INSERT INTO ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " attachments` (`ticket_id`,`saved_name`,`real_name`,`size`) VALUES (' { $trackingID } ',' " . hesk_dbEscape ( $myatt [ 'saved_name' ]) . " ',' " . hesk_dbEscape ( $myatt [ 'real_name' ]) . " ',' " . intval ( $myatt [ 'size' ]) . " ') " );
2015-04-12 15:26:53 -04:00
$myattachments .= hesk_dbInsertID () . '#' . $myatt [ 'real_name' ] . '#' . $myatt [ 'saved_name' ] . ',' ;
2014-06-28 14:59:48 -04:00
}
}
// If staff hasn't replied yet, don't change the status; otherwise set it to the status for customer replies.
$customerReplyStatusQuery = 'SELECT `ID` FROM `' . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . 'statuses` WHERE `IsCustomerReplyStatus` = 1' ;
$defaultNewTicketStatusQuery = 'SELECT `ID` FROM `' . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . 'statuses` WHERE `IsNewTicketStatus` = 1' ;
$newStatus = hesk_dbQuery ( $customerReplyStatusQuery ) -> fetch_assoc ();
$defaultNewTicketStatus = hesk_dbQuery ( $defaultNewTicketStatusQuery ) -> fetch_assoc ();
$ticket [ 'status' ] = $ticket [ 'status' ] == $defaultNewTicketStatus [ 'ID' ] ? $defaultNewTicketStatus [ 'ID' ] : $newStatus [ 'ID' ];
/* Update ticket as necessary */
2015-01-12 23:10:18 -05:00
$res = hesk_dbQuery ( " UPDATE ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " tickets` SET `lastchange`=NOW(), `status`=' { $ticket [ 'status' ] } ', `replies`=`replies`+1, `lastreplier`='0' WHERE `id`=' { $ticket [ 'id' ] } ' LIMIT 1 " );
2014-06-28 14:59:48 -04:00
// Insert reply into database
2015-08-21 12:45:10 -04:00
$html = $modsForHesk_settings [ 'rich_text_for_tickets_for_customers' ];
2015-08-19 07:46:52 -04:00
hesk_dbQuery ( " INSERT INTO ` " . hesk_dbEscape ( $hesk_settings [ 'db_pfix' ]) . " replies` (`replyto`,`name`,`message`,`dt`,`attachments`, `html`) VALUES ( { $ticket [ 'id' ] } ,' " . hesk_dbEscape ( $ticket [ 'name' ]) . " ',' " . hesk_dbEscape ( $message ) . " ',NOW(),' " . hesk_dbEscape ( $myattachments ) . " ',' " . $html . " ') " );
2014-06-28 14:59:48 -04:00
/*** Need to notify any staff? ***/
// --> Prepare reply message
// 1. Generate the array with ticket info that can be used in emails
$info = array (
'email' => $ticket [ 'email' ],
'category' => $ticket [ 'category' ],
'priority' => $ticket [ 'priority' ],
'owner' => $ticket [ 'owner' ],
'trackid' => $ticket [ 'trackid' ],
'status' => $ticket [ 'status' ],
'name' => $ticket [ 'name' ],
'lastreplier' => $ticket [ 'name' ],
'subject' => $ticket [ 'subject' ],
'message' => stripslashes ( $message ),
'attachments' => $myattachments ,
2014-08-05 20:26:47 -04:00
'dt' => hesk_date ( $ticket [ 'dt' ], true ),
'lastchange' => hesk_date ( $ticket [ 'lastchange' ], true ),
2015-01-12 23:10:18 -05:00
'id' => $ticket [ 'id' ],
2014-06-28 14:59:48 -04:00
);
// 2. Add custom fields to the array
foreach ( $hesk_settings [ 'custom_fields' ] as $k => $v )
{
$info [ $k ] = $v [ 'use' ] ? $ticket [ $k ] : '' ;
}
// 3. Make sure all values are properly formatted for email
$ticket = hesk_ticketToPlain ( $info , 1 , 0 );
// --> If ticket is assigned just notify the owner
if ( $ticket [ 'owner' ])
{
hesk_notifyAssignedStaff ( false , 'new_reply_by_customer' , 'notify_reply_my' );
}
// --> No owner assigned, find and notify appropriate staff
else
{
hesk_notifyStaff ( 'new_reply_by_customer' , " `notify_reply_unassigned`='1' " );
}
/* Clear unneeded session variables */
hesk_cleanSessionVars ( 'ticket_message' );
/* Show the ticket and the success message */
hesk_process_messages ( $hesklang [ 'reply_submitted_success' ], 'ticket.php?track=' . $trackingID . $hesk_settings [ 'e_param' ] . '&Refresh=' . rand ( 10000 , 99999 ), 'SUCCESS' );
exit ();
?>