From 0275adc7df0c6002e4af041d3a6208a3b0b66faf Mon Sep 17 00:00:00 2001 From: Chris Filkins Date: Mon, 12 Jan 2026 10:51:03 -0600 Subject: [PATCH] Added user agent to LTI calls --- src/Util/LTI13.php | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Util/LTI13.php b/src/Util/LTI13.php index 95db06dbc3..ddce390569 100644 --- a/src/Util/LTI13.php +++ b/src/Util/LTI13.php @@ -480,6 +480,8 @@ public static function sendLineItemResult($user_id, $grade, $scoreMaximum, $comm if ( is_array($debug_log) ) $debug_log[] = $headers; if ( is_array($debug_log) ) $debug_log[] = $grade_call; + self::setUserAgentCurl($ch); // Set the User-Agent header + $line_item = curl_exec($ch); if ( $line_item === false ) return self::handle_curl_error($ch, $debug_log); @@ -537,6 +539,8 @@ public static function loadNRPS($membership_url, $access_token, &$debug_log=fals if ( is_array($debug_log) ) $debug_log[] = $membership_url; if ( is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $membership = curl_exec($ch); if ( $membership === false ) return self::handle_curl_error($ch, $debug_log); @@ -637,6 +641,8 @@ public static function loadGroups($context_groups_url, $access_token, &$debug_lo if ( is_array($debug_log) ) $debug_log[] = $context_groups_url; if ( is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $lti_groups = curl_exec($ch); if ( $lti_groups === false ) return self::handle_curl_error($ch, $debug_log); @@ -727,6 +733,8 @@ public static function loadLineItems($lineitems_url, $access_token, &$debug_log= if (is_array($debug_log) ) $debug_log[] = 'Line Items URL: '.$lineitems_url; if (is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $lineitems = curl_exec($ch); if ( $lineitems === false ) return self::handle_curl_error($ch, $debug_log); @@ -779,6 +787,8 @@ public static function loadLineItem($lineitem_url, $access_token, &$debug_log=fa if (is_array($debug_log) ) $debug_log[] = 'Line Items URL: '.$lineitem_url; if (is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $lineitem = curl_exec($ch); if ( $lineitem === false ) return self::handle_curl_error($ch, $debug_log); @@ -836,6 +846,8 @@ public static function loadResults($lineitem_url, $access_token, &$debug_log=fal if (is_array($debug_log) ) $debug_log[] = 'Line Items URL: '.$actual_url; if (is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $results = curl_exec($ch); if ( $results === false ) return self::handle_curl_error($ch, $debug_log); @@ -897,6 +909,8 @@ public static function deleteLineItem($lineitem_url, $access_token, &$debug_log= if (is_array($debug_log) ) $debug_log[] = 'Line Item URL: '.$lineitem_url; if (is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $response = curl_exec($ch); if ( $response === false ) return self::handle_curl_error($ch, $debug_log); @@ -969,6 +983,8 @@ public static function createLineItem($lineitems_url, $access_token, $lineitem, if (is_array($debug_log) ) $debug_log[] = 'Line Items URL: '.$lineitems_url; if (is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $line_item = curl_exec($ch); if ( $line_item === false ) return self::handle_curl_error($ch, $debug_log); @@ -1038,6 +1054,8 @@ public static function updateLineItem($lineitem_url, $access_token, $lineitem, & if (is_array($debug_log) ) $debug_log[] = 'Line Item URL: '.$lineitem_url; if (is_array($debug_log) ) $debug_log[] = $headers; + self::setUserAgentCurl($ch); // Set the User-Agent header + $line_item = curl_exec($ch); if ( $line_item === false ) return self::handle_curl_error($ch, $debug_log); @@ -1121,6 +1139,8 @@ public static function get_access_token($scope, $subject, $lti13_token_url, $lti if ( is_array($debug_log) ) $debug_log[] = "Post Data:"; if ( is_array($debug_log) ) $debug_log[] = $query; + self::setUserAgentCurl($ch); // Set the User-Agent header + $token_str = curl_exec($ch); if ( $token_str === false ) { self::handle_curl_error($ch, $debug_log); @@ -1478,4 +1498,19 @@ public static function extractKeyFromKeySet($keyset_str, $kid) return null; } + public static function setUserAgentCurl($ch) + { + global $CFG; + + // Construct a robust default User-Agent + $default_agent = 'Tsugi/' . + (defined('TSUGI_VERSION') ? TSUGI_VERSION : 'dev') . + ' (' . (isset($CFG->wwwroot) ? $CFG->wwwroot : 'https://www.tsugi.org') . ')' . + ' PHP/' . phpversion(); + + // Allow overrides via extension mechanism + $user_agent = $CFG->getExtension('user_agent', $default_agent); + + curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); + } }