From b6450cc72257a9f8bc18b49a518de25dd4dadcc1 Mon Sep 17 00:00:00 2001 From: halcyonyarn Date: Mon, 29 Aug 2022 14:04:02 -0400 Subject: [PATCH 1/6] several updates: adding form data for new tickets, adding a new user if one does not yet exist when a ticket is created, making some parameters optional in service of those goals. --- ost_wbs/classes/class.dbconnection.php | 8 +- ost_wbs/classes/class.helper.php | 13 +-- ost_wbs/classes/class.key.php | 8 +- ost_wbs/classes/class.ticket.php | 112 ++++++++++++++++++++++++- ost_wbs/classes/class.user.php | 81 +++++++++++++----- ost_wbs/config.php | 12 +-- ost_wbs/index.php | 12 +-- 7 files changed, 196 insertions(+), 50 deletions(-) diff --git a/ost_wbs/classes/class.dbconnection.php b/ost_wbs/classes/class.dbconnection.php index 8835ba3..c9bcfef 100644 --- a/ost_wbs/classes/class.dbconnection.php +++ b/ost_wbs/classes/class.dbconnection.php @@ -3,17 +3,17 @@ # DB Connection class DBConnection{ function getDBConnect(){ - + $mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DBNAME) or die("Couldn't connect"); - + if ($mysqli->connect_errno) { echo "ERROR: Cannot connect web service to database"; echo "

MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}

"; exit(); } - return $mysqli; + return $mysqli; } } -?> \ No newline at end of file +?> diff --git a/ost_wbs/classes/class.helper.php b/ost_wbs/classes/class.helper.php index 4868c70..9ca1140 100644 --- a/ost_wbs/classes/class.helper.php +++ b/ost_wbs/classes/class.helper.php @@ -100,7 +100,8 @@ static function escapeParameters($parameters) } // Check parameters - static function checkRequest($parameters, $expectedParameters) + // Optional parameters added for flexibility in adding users etc + static function checkRequest($parameters, $expectedParameters, $optionalParameters=array()) { // Error array @@ -111,21 +112,21 @@ static function checkRequest($parameters, $expectedParameters) // Check for empty fields foreach ($expectedParameters as $key => $value) { - if(empty($parameters["parameters"][$value])) { - array_push($errors,"Empty or Incorrect fields were given."); + if(empty($parameters["parameters"][$value])&& !is_numeric($parameters["parameters"][$value])) { + array_push($errors,"Empty or Incorrect fields were given. ".$key." ".$value); } } // Check for unkown or unexpected fields foreach ($parameters["parameters"] as $key => $value) { - if (!in_array($key, $expectedParameters)) { + if (!in_array($key, $expectedParameters) && !in_array($key, $optionalParameters)) { array_push($errors,"Unexpectec fields given."); } } // If no errors, continue if(count($errors) > 0){ - throw new Exception("Empty or Incorrect fields were given, read documentation for more info."); + throw new Exception("Empty or Incorrect fields were given, read documentation for more info. ".var_export($errors,true)); } } else { @@ -239,4 +240,4 @@ static function remove_accents($string) { $string = strtr($string, $chars); return $string; } -} \ No newline at end of file +} diff --git a/ost_wbs/classes/class.key.php b/ost_wbs/classes/class.key.php index 4e5aca0..584f233 100644 --- a/ost_wbs/classes/class.key.php +++ b/ost_wbs/classes/class.key.php @@ -15,10 +15,12 @@ function OAuth($key) { if($key) $this->key = $key; - if(strlen($key) != 32) { throw new Exception("Incorrect API Format"); } + if(strlen($key) != 32) { throw new Exception("Incorrect API Format, or else"); } // Connect Database - $Dbobj = new DBConnection(); + // this wasn't being auto loaded? + require_once 'classes/class.dbconnection.php'; + $Dbobj = new DBConnection; $mysqli = $Dbobj->getDBConnect(); // Check API Key @@ -65,4 +67,4 @@ function ippaddr() $apiAuth = new apiKey; $apiAuth->OAuth($key["apikey"]); -?> \ No newline at end of file +?> diff --git a/ost_wbs/classes/class.ticket.php b/ost_wbs/classes/class.ticket.php index aff6547..436009b 100644 --- a/ost_wbs/classes/class.ticket.php +++ b/ost_wbs/classes/class.ticket.php @@ -193,7 +193,7 @@ public function add($parameters) Helper::validRequest($validRequests); // Expected parameters - $expectedParameters = array("title", "subject", "user_id", "priority_id", "status_id", "dept_id", "sla_id", "topic_id"); + $expectedParameters = array("title", "subject", "user_id", "priority_id", "status_id", "dept_id", "sla_id", "topic_id","internal_note","internal_note_subject"); // Check if all paremeters are correct Helper::checkRequest($parameters, $expectedParameters); @@ -202,7 +202,7 @@ public function add($parameters) $last_ticket_id = Helper::get_last_id("ticket", "ticket_id"); $ticket_number = $last_ticket_id+1; - $ticker_number = "API".$ticket_number; + $ticker_number = "TK".$ticket_number; // table - 'ticket' $ticket = 'insert into '.TABLE_PREFIX.'ticket ('; @@ -264,6 +264,71 @@ public function add($parameters) // Get inserted thread ID $last_thread_id = Helper::get_last_id("thread", "id"); + //not sure if form 2 is commonly or universally a good choice, but it is the default in our installs. + // table - 'form_entry' + $form_entry = 'insert into '.TABLE_PREFIX.'form_entry ('; + $form_entry .= 'form_id,'; + $form_entry .= 'object_id,'; + $form_entry .= 'object_type,'; + $form_entry .= 'updated,'; + $form_entry .= 'created) VALUES ('; + $form_entry .= '2,'; + $form_entry .= ''.$last_ticket_id.','; + $form_entry .= '"T",'; + $form_entry .= 'now(),'; + $form_entry .= 'now())'; + + // Send query to be executed + $this->execQuery($form_entry); + + // Get inserted thread ID and increment for form values + $last_form_entry= Helper::get_last_id("form_entry", "id"); + + // table - 'form_entry_values' + $form_entry_values = 'insert into '.TABLE_PREFIX.'form_entry_values ('; + $form_entry_values .= 'entry_id,'; + $form_entry_values .= 'field_id,'; + $form_entry_values .= 'value,'; + $form_entry_values .= 'value_id) VALUES'; + + //Not sure how config/install specific these are, but, this is an attempt to get the priority and subject + //so that they can be populated. Other form fields are left null. + // table - 'form_entry' + $form_fields = 'select form_id, label, name, id from '.TABLE_PREFIX.'form_field where '; + $form_fields .= 'form_id = 2'; + // Send query to be executed + $Dbobj = new DBConnection(); + $mysqli = $Dbobj->getDBConnect(); + $getForm = $mysqli->query($form_fields); + + $form_entry_value=array(); + $fev=array(); + // Fetch data + while($FormFields= $getForm->fetch_object()) + { + //build the query to add subject and priority, and null for other form_field_values + $fev= '('; + $fev.= ''.$last_form_entry.','; + $fev.= ''.$FormFields->id.','; + if($FormFields->name=='priority'){ + $fev.= '"Normal",'; + $fev.= '2)'; + }elseif($FormFields->name=='subject'){ + $fev.= '"'.utf8_decode($parameters["parameters"]["title"]).'",'; + $fev.= 'null)'; + }else{ + $fev.= 'null,'; + $fev.= 'null)'; + } + $form_entry_value[]=$fev; + } + $form_entry_values.=implode(", ",$form_entry_value); + // Send query to be executed + $this->execQuery($form_entry_values); + + + // Get inserted thread ID + $last_thread_id = Helper::get_last_id("thread", "id"); // table - 'thread_entry' $thread_entry = 'insert into '.TABLE_PREFIX.'thread_entry ('; $thread_entry .= 'format,'; @@ -296,7 +361,48 @@ public function add($parameters) $thread_entry .= 'now())'; // Send query to be executed - return $this->execQuery($thread_entry); + $thread = $this->execQuery($thread_entry); + + //From our CRM, it is useful to add an internal note via API. If this optional data is supplied, add note here. + if($parameters["parameters"]["internal_note"]!=""){ + $last_thread_id = Helper::get_last_id("thread", "id"); + // table - 'thread_entry' + $thread_entry = 'insert into '.TABLE_PREFIX.'thread_entry ('; + $thread_entry .= 'format,'; + $thread_entry .= 'ip_address,'; + $thread_entry .= 'pid,'; + $thread_entry .= 'thread_id,'; + $thread_entry .= 'staff_id,'; + $thread_entry .= 'user_id,'; + $thread_entry .= 'type,'; + $thread_entry .= 'poster,'; + $thread_entry .= 'flags,'; + $thread_entry .= 'source,'; + $thread_entry .= 'title,'; + $thread_entry .= 'body,'; + $thread_entry .= 'created,'; + $thread_entry .= 'updated) VALUES ('; + $thread_entry .= '"html",'; + $thread_entry .= '0,'; + $thread_entry .= '0,'; + $thread_entry .= ''.$last_thread_id.','; + $thread_entry .= '0,'; + $thread_entry .= ''.$parameters["parameters"]["user_id"].','; + $thread_entry .= '"N",'; + $thread_entry .= '"osTicket Support",'; + $thread_entry .= '65,'; + $thread_entry .= '"API",'; + $thread_entry .= '"'.utf8_decode($parameters["parameters"]["internal_note_subject"]).'",'; + $thread_entry .= '"

'.utf8_decode($parameters["parameters"]["internal_note"]).'

",'; + $thread_entry .= 'now(),'; + $thread_entry .= 'now())'; + + // Send query to be executed + $internal_note = $this->execQuery($thread_entry); + + return $internal_note; + } + return $thread; } public function reply($parameters) diff --git a/ost_wbs/classes/class.user.php b/ost_wbs/classes/class.user.php index f464231..085f00c 100644 --- a/ost_wbs/classes/class.user.php +++ b/ost_wbs/classes/class.user.php @@ -108,7 +108,9 @@ public function specific($parameters) { array_push($result, array( - 'user_id'=>$PrintUsers->id, + //this seemed to be returning "id" rather than "user_id"? Adding / changing to include both id and user_id... + 'user_id'=>$PrintUsers->user_id, + 'id'=>$PrintUsers->id, 'name'=>utf8_encode($PrintUsers->name), 'created'=>$PrintUsers->created )); @@ -137,10 +139,18 @@ public function add($parameters) Helper::validRequest($validRequests); // Expected parameters - $expectedParameters = array("name", "email", "password", "timezone", "phone", "org_id", "default_email_id", "status"); + $expectedParameters = array("name", "email", "org_id", "status"); + + // Optional parameters are used to be able to create a user account / login for the customer. + // We needed this from our CRM, to be able + // to automatically create a user if one was not found. + $optionalParameters = array("default_email_id", "password", "timezone", "phone"); + + //this needs to be updated later, bit of a catch 22 with required fields + $default_email_id=0; // Check if all paremeters are correct - Helper::checkRequest($parameters, $expectedParameters); + Helper::checkRequest($parameters, $expectedParameters, $optionalParameters); // Escape parameters $parameters['parameters'] = Helper::escapeParameters($parameters["parameters"]); @@ -157,7 +167,7 @@ public function add($parameters) $user .= 'created,'; $user .= 'updated) VALUES ('; $user .= ''.$parameters["parameters"]["org_id"].','; - $user .= ''.$parameters["parameters"]["default_email_id"].','; + $user .= ''.$default_email_id.','; $user .= ''.$parameters["parameters"]["status"].','; $user .= '"'.$parameters["parameters"]["name"].'",'; $user .= 'now(),'; @@ -166,6 +176,9 @@ public function add($parameters) // Send query to be executed $this->execQuery($user); + error_log($user); + error_log("-----"); + error_log("-----"); // Get inserted user ID $last_user_id = Helper::get_last_id("user", "id"); @@ -183,6 +196,9 @@ public function add($parameters) // Send query to be executed $this->execQuery($user__cdata); + error_log($user__cdata); + error_log("-----"); + error_log("-----"); // table - 'user_email' $user_email = 'insert into '.TABLE_PREFIX.'user_email ('; $user_email .= 'user_id,'; @@ -190,24 +206,45 @@ public function add($parameters) $user_email .= ''.$last_user_id.','; $user_email .= '"'.$parameters["parameters"]["email"].'")'; - // Send query to be executed - $this->execQuery($user_email); - - // table - 'ost_user_account' - $user_account = 'insert into '.TABLE_PREFIX.'user_account ('; - $user_account .= 'user_id,'; - $user_account .= 'status,'; - $user_account .= 'timezone,'; - $user_account .= 'passwd,'; - $user_account .= 'registered) VALUES ('; - $user_account .= ''.$last_user_id.', '; - $user_account .= '1, '; - $user_account .= '"'.$parameters["parameters"]["timezone"].'", '; - $user_account .= '"'.$parameters["parameters"]["password"].'", '; - $user_account .= 'now())'; + $this->execQuery($user_email); + error_log($user_email); + error_log("-----"); + error_log("-----"); + if(!empty($parameters["parameters"]["default_email_id"])){ + $default_email_id = $parameters["parameters"]["default_email_id"]; + }else{ + $default_email_id = Helper::get_last_id("user_email", "id"); + } + + + // table - 'user', this corrects the default_email_id + $user_update = 'update '.TABLE_PREFIX.'user set '; + $user_update .= 'default_email_id = "'.$default_email_id.'"'; + $user_update .= 'where id = "'.$last_user_id.'"'; // Send query to be executed - return $this->execQuery($user_account); + $user_updated=$this->execQuery($user_update); + + if(!empty($parameters["parameters"]["password"]) && !empty($parameters["parameters"]["timezone"])){ + // table - 'ost_user_account' + // must have user encoded password + $last_user_email_id = Helper::get_last_id("user_email", "id"); + $user_account = 'insert into '.TABLE_PREFIX.'user_account ('; + $user_account .= 'user_id,'; + $user_account .= 'status,'; + $user_account .= 'timezone,'; + $user_account .= 'passwd,'; + $user_account .= 'registered) VALUES ('; + $user_account .= ''.$last_user_email_id.', '; + $user_account .= '1, '; + $user_account .= '"'.$parameters["parameters"]["timezone"].'", '; + $user_account .= '"'.$parameters["parameters"]["password"].'", '; + $user_account .= 'now())'; + // Send query to be executed + return $this->execQuery($user_account); + } + return $user_updated; + } @@ -245,8 +282,8 @@ private function execQuery($string) return $last_user_id; } else { - throw new Exception("Something went wrong."); + throw new Exception("Something went wrong.".$string); } } } -?> \ No newline at end of file +?> diff --git a/ost_wbs/config.php b/ost_wbs/config.php index 4d980e1..d61d24b 100644 --- a/ost_wbs/config.php +++ b/ost_wbs/config.php @@ -1,14 +1,14 @@ $sort, "parameters" => $parameters); From 661b9b710e3a74e6b549664f60df2e2f6d51923b Mon Sep 17 00:00:00 2001 From: halcyonyarn Date: Mon, 29 Aug 2022 15:14:01 -0400 Subject: [PATCH 2/6] fix for optionalParams --- ost_wbs/classes/class.helper.php | 4 ++-- ost_wbs/classes/class.ticket.php | 12 +++++++----- ost_wbs/classes/class.user.php | 11 +---------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/ost_wbs/classes/class.helper.php b/ost_wbs/classes/class.helper.php index 9ca1140..981b10b 100644 --- a/ost_wbs/classes/class.helper.php +++ b/ost_wbs/classes/class.helper.php @@ -113,7 +113,7 @@ static function checkRequest($parameters, $expectedParameters, $optionalParamete // Check for empty fields foreach ($expectedParameters as $key => $value) { if(empty($parameters["parameters"][$value])&& !is_numeric($parameters["parameters"][$value])) { - array_push($errors,"Empty or Incorrect fields were given. ".$key." ".$value); + array_push($errors,"Empty or Incorrect expected fields were given. ".$key." ".$value); } } @@ -126,7 +126,7 @@ static function checkRequest($parameters, $expectedParameters, $optionalParamete // If no errors, continue if(count($errors) > 0){ - throw new Exception("Empty or Incorrect fields were given, read documentation for more info. ".var_export($errors,true)); + throw new Exception("Empty or Incorrect fields were given, read documentation for more info. "); } } else { diff --git a/ost_wbs/classes/class.ticket.php b/ost_wbs/classes/class.ticket.php index 436009b..b637de2 100644 --- a/ost_wbs/classes/class.ticket.php +++ b/ost_wbs/classes/class.ticket.php @@ -193,10 +193,12 @@ public function add($parameters) Helper::validRequest($validRequests); // Expected parameters - $expectedParameters = array("title", "subject", "user_id", "priority_id", "status_id", "dept_id", "sla_id", "topic_id","internal_note","internal_note_subject"); + $expectedParameters = array("title", "subject", "user_id", "priority_id", "status_id", "dept_id", "sla_id", "topic_id"); + // These may be useful, but should be optional, as a way to add internal only info when creating ticket from CRM + $optionalParameters = array("priority_name", "internal_note","internal_note_subject"); // Check if all paremeters are correct - Helper::checkRequest($parameters, $expectedParameters); + Helper::checkRequest($parameters, $expectedParameters, $optionalParameters); // Prepare query @@ -243,7 +245,7 @@ public function add($parameters) $ticket__cdata .= 'subject,'; $ticket__cdata .= 'priority) VALUES ('; $ticket__cdata .= ''.$last_ticket_id.','; - $ticket__cdata .= '"'.utf8_decode($parameters["parameters"]["subject"]).'",'; + $ticket__cdata .= '"'.utf8_decode($parameters["parameters"]["title"]).'",'; $ticket__cdata .= ''.$parameters["parameters"]["priority_id"].')'; // Send query to be executed @@ -311,8 +313,8 @@ public function add($parameters) $fev.= ''.$last_form_entry.','; $fev.= ''.$FormFields->id.','; if($FormFields->name=='priority'){ - $fev.= '"Normal",'; - $fev.= '2)'; + $fev.= '"'.$parameters["parameters"]["priority_name"].'",'; + $fev.= ''.$parameters["parameters"]["priority_id"].')'; }elseif($FormFields->name=='subject'){ $fev.= '"'.utf8_decode($parameters["parameters"]["title"]).'",'; $fev.= 'null)'; diff --git a/ost_wbs/classes/class.user.php b/ost_wbs/classes/class.user.php index 085f00c..c3f099b 100644 --- a/ost_wbs/classes/class.user.php +++ b/ost_wbs/classes/class.user.php @@ -176,9 +176,6 @@ public function add($parameters) // Send query to be executed $this->execQuery($user); - error_log($user); - error_log("-----"); - error_log("-----"); // Get inserted user ID $last_user_id = Helper::get_last_id("user", "id"); @@ -196,9 +193,6 @@ public function add($parameters) // Send query to be executed $this->execQuery($user__cdata); - error_log($user__cdata); - error_log("-----"); - error_log("-----"); // table - 'user_email' $user_email = 'insert into '.TABLE_PREFIX.'user_email ('; $user_email .= 'user_id,'; @@ -207,9 +201,6 @@ public function add($parameters) $user_email .= '"'.$parameters["parameters"]["email"].'")'; $this->execQuery($user_email); - error_log($user_email); - error_log("-----"); - error_log("-----"); if(!empty($parameters["parameters"]["default_email_id"])){ $default_email_id = $parameters["parameters"]["default_email_id"]; @@ -282,7 +273,7 @@ private function execQuery($string) return $last_user_id; } else { - throw new Exception("Something went wrong.".$string); + throw new Exception("Something went wrong."); } } } From 003e1e77b8b9ae1c0a5f9057fe786592c6537d2b Mon Sep 17 00:00:00 2001 From: halcyonyarn Date: Mon, 29 Aug 2022 15:20:51 -0400 Subject: [PATCH 3/6] whoops match config format --- ost_wbs/config.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ost_wbs/config.php b/ost_wbs/config.php index d61d24b..4d6bac9 100644 --- a/ost_wbs/config.php +++ b/ost_wbs/config.php @@ -4,11 +4,11 @@ //error_reporting(); // Database Credentials -define('DBTYPE',''); -define('DBHOST',''); -define('DBNAME',''); -define('DBUSER',''); -define('DBPASS',''); +define('DBTYPE',''); // Database type (mysql, sql..) +define('DBHOST',''); // IP Address +define('DBNAME',''); // Database Name +define('DBUSER',''); // Database User +define('DBPASS',''); // Database Password // Table prefix define('TABLE_PREFIX','ost_'); From be05b8f60121ee61c7f4ed0c847a767a1a277280 Mon Sep 17 00:00:00 2001 From: halcyonyarn Date: Mon, 29 Aug 2022 15:21:57 -0400 Subject: [PATCH 4/6] whoops match config format --- ost_wbs/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ost_wbs/config.php b/ost_wbs/config.php index 4d6bac9..4d980e1 100644 --- a/ost_wbs/config.php +++ b/ost_wbs/config.php @@ -1,7 +1,7 @@ Date: Mon, 29 Aug 2022 15:23:06 -0400 Subject: [PATCH 5/6] whoops match config format --- ost_wbs/classes/class.key.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ost_wbs/classes/class.key.php b/ost_wbs/classes/class.key.php index 584f233..0d6111c 100644 --- a/ost_wbs/classes/class.key.php +++ b/ost_wbs/classes/class.key.php @@ -15,7 +15,7 @@ function OAuth($key) { if($key) $this->key = $key; - if(strlen($key) != 32) { throw new Exception("Incorrect API Format, or else"); } + if(strlen($key) != 32) { throw new Exception("Incorrect API Format"); } // Connect Database // this wasn't being auto loaded? From 17bfe9168adc63b23b68f1fa8dba947b8aa899c1 Mon Sep 17 00:00:00 2001 From: halcyonyarn Date: Mon, 29 Aug 2022 15:46:09 -0400 Subject: [PATCH 6/6] make form id generic to parameter --- ost_wbs/classes/class.ticket.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ost_wbs/classes/class.ticket.php b/ost_wbs/classes/class.ticket.php index b637de2..903f818 100644 --- a/ost_wbs/classes/class.ticket.php +++ b/ost_wbs/classes/class.ticket.php @@ -195,7 +195,7 @@ public function add($parameters) // Expected parameters $expectedParameters = array("title", "subject", "user_id", "priority_id", "status_id", "dept_id", "sla_id", "topic_id"); // These may be useful, but should be optional, as a way to add internal only info when creating ticket from CRM - $optionalParameters = array("priority_name", "internal_note","internal_note_subject"); + $optionalParameters = array("form_id", "priority_name", "internal_note","internal_note_subject"); // Check if all paremeters are correct Helper::checkRequest($parameters, $expectedParameters, $optionalParameters); @@ -274,7 +274,7 @@ public function add($parameters) $form_entry .= 'object_type,'; $form_entry .= 'updated,'; $form_entry .= 'created) VALUES ('; - $form_entry .= '2,'; + $form_entry .= '"'.$parameters["parameters"]["form_id"].'",'; $form_entry .= ''.$last_ticket_id.','; $form_entry .= '"T",'; $form_entry .= 'now(),'; @@ -294,14 +294,16 @@ public function add($parameters) $form_entry_values .= 'value_id) VALUES'; //Not sure how config/install specific these are, but, this is an attempt to get the priority and subject - //so that they can be populated. Other form fields are left null. + //so that they can be populated. Other form fields are left null. Since they are required fields, should work? // table - 'form_entry' $form_fields = 'select form_id, label, name, id from '.TABLE_PREFIX.'form_field where '; - $form_fields .= 'form_id = 2'; + $form_fields .= 'form_id = "'.$parameters["parameters"]["form_id"].'"'; + // Send query to be executed $Dbobj = new DBConnection(); $mysqli = $Dbobj->getDBConnect(); $getForm = $mysqli->query($form_fields); + error_log(var_dump($getForm,true)); $form_entry_value=array(); $fev=array();