Files
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

243 lines
8.4 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: Stefan
* Date: 08.08.2016
* Time: 15:24
*/
namespace Workflow;
class OAuth
{
private static $tablename = 'vtiger_wf_oauth';
public static function isDone($key) {
$adb = \PearDatabase::getInstance();
$sql = 'SELECT id, done FROM '.self::$tablename.' WHERE name = ? OR hash = ?';
$result = $adb->pquery($sql, array($key, $key));
$data = $adb->fetchByAssoc($result);
return $data['done'] == '1';
}
public static function getById($id) {
$adb = \PearDatabase::getInstance();
$sql = 'SELECT hash FROM '.self::$tablename.' WHERE id = ?';
$result = $adb->pquery($sql, array(intval($id)));
if($adb->num_rows($result) == 0) {
return null;
}
$data = $adb->fetchByAssoc($result);
return new OAuth($data['hash']);
}
public static function outputButton($OAuthHash, $reloadAfterConnect = false) {
$workflowObj = new \Workflow2();
?>
<script type="text/javascript" src="modules/Settings/Workflow2/views/resources/OAuthHandler.js?v=<?php $workflowObj->getVersion() ?>"></script>
<div id="oauthbtn_<?php echo $OAuthHash; ?>">
<button type="button" class="btn btn-primary" onclick="OAuthHandler.start('<?php echo $OAuthHash; ?>', <?php echo ($reloadAfterConnect?'true':'false'); ?>);"><?php echo vtranslate('Authorize Workflow Designer Link', 'Settings:Workflow2'); ?></button><br/>
</div>
<div id="oauth_<?php echo $OAuthHash; ?>" data-text1="<?php echo vtranslate('Check authorization', 'Settings:Workflow2'); ?>" data-text2="<?php echo vtranslate('Authorization done successfully!', 'Settings:Workflow2'); ?>" style="font-weight:bold;display:none;"></div>
<?php
}
public static function init($handler, $name, $returnPending = false) {
$adb = \PearDatabase::getInstance();
$sql = 'DELETE FROM '.self::$tablename.' WHERE created < '.date('Y-m-d', time() - (86400)).' AND done = 0';
$adb->query($sql, true);
if($returnPending === true) {
$sql = 'SELECT id, hash FROM '.self::$tablename.' WHERE name = ? AND userid = ? AND done = 0 AND created > '.date('Y-m-d', time() - (85800)).'';
$result = $adb->pquery($sql, array($name, VtUtils::getCurrentUserId()), true);
if($adb->num_rows($result) > 0) {
return $adb->query_result($result, 0, 'hash');
}
}
$hash = sha1($name.microtime());
$sql = 'INSERT INTO '.self::$tablename.' SET userid = ?, name = ?, hash = ?, handler = ?, created = NOW(), done = 0';
$adb->pquery($sql, array(VtUtils::getCurrentUserId(), $name, $hash, $handler), true);
return $hash;
}
public static function loadHandler() {
$alle = glob(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..'. DIRECTORY_SEPARATOR . 'extends' . DIRECTORY_SEPARATOR . 'oauthhandler' . DIRECTORY_SEPARATOR . '*.inc.php');
foreach($alle as $datei) {
require_once(realpath($datei));
}
}
/*** Object Methods **/
private $_key = null;
private $_data = null;
/**
* OAuth constructor.
* @param $key
*/
public function __construct($key) {
$this->_key = $key;
}
/**
* @return url
*/
public function getAuthorizationUrl() {
$url = $this->callHandler('get_authorization_url');
return $url;
}
public function delete() {
$adb = \PearDatabase::getInstance();
$sql = 'DELETE FROM '.self::$tablename.' WHERE name = ? OR hash = ?';
$adb->pquery($sql, array($this->_key, $this->_key), true);
}
public function callback($params) {
$this->callHandler('callback', array($params));
}
/**
* @param $data AccessToken
* @param $expire Integer
*/
public function done($accessToken, $refreshToken, $expire) {
$data = $this->getData();
$adb = \PearDatabase::getInstance();
$accessToken = VtUtils::encrypt($accessToken);
$refreshToken = VtUtils::encrypt($refreshToken);
if(!empty($refreshToken)) {
$sql = 'UPDATE ' . self::$tablename . ' SET data = ?, refresh = ?, expire = ?, done = 1 WHERE id = ?';
$adb->pquery($sql, array($accessToken, $refreshToken, date('Y-m-d H:i:s', $expire), $data['id']));
} else {
$sql = 'UPDATE ' . self::$tablename . ' SET data = ?, expire = ?, done = 1 WHERE id = ?';
$adb->pquery($sql, array($accessToken, date('Y-m-d H:i:s', $expire), $data['id']));
}
}
public function getAccessToken() {
$data = $this->getData();
if($data['expire'] < date('Y-m-d H:i:s', time() + 3600)) {
$adb = \PearDatabase::getInstance();
$response = VtUtils::getContentFromUrl(OAUTH_CALLBACK_REFRESH, array(
'token' => VtUtils::decrypt($data['refresh']),
'provider' => $data['provider'],
), 'post');
$response = VtUtils::json_decode($response);
$accessToken = VtUtils::encrypt($response['accesstoken']);
$expire = $response['expire'];
$sql = 'UPDATE ' . self::$tablename . ' SET data = ?, expire = ?, done = 1 WHERE id = ?';
$adb->pquery($sql, array($accessToken, date('Y-m-d H:i:s', $expire), $data['id']));
$data['data'] = $accessToken;
}
return VtUtils::decrypt($data['data']);
}
public static function getInternalCallbackUrl($currentHash) {
$adb = \PearDatabase::getInstance();
$sql = 'SELECT * FROM vtiger_shorturls WHERE handler_class = "Workflow2_OAuthHTTPHandler_Handler" LIMIT 1';
$result = $adb->query($sql);
if($adb->num_rows($result) == 0) {
$options = array(
'handler_path' => 'modules/Workflow2/OAuthHTTPHandler.php',
'handler_class' => 'Workflow2_OAuthHTTPHandler_Handler',
'handler_function' => 'handle',
'handler_data' => array()
);
$uid = \Vtiger_ShortURL_Helper::generate($options);
$callbackUrl = rtrim(vglobal('site_URL'), '/') . "/shorturl.php?id=" . $uid.(!empty($currentHash)?'&_h='.$currentHash:'');
} else {
$callbackUrl = rtrim(vglobal('site_URL'), '/') . "/shorturl.php?id=" . $adb->query_result($result, 0, 'uid').(!empty($currentHash)?'&_h='.$currentHash:'');
}
return $callbackUrl;
}
public function getHash() {
$data = $this->getData();
return $data['hash'];
}
public function getCallbackUrl($service_provider) {
$data = $this->getData();
$options = array(
'onetime' => 1,
'handler_path' => 'modules/Workflow2/OAuthHTTPHandler.php',
'handler_class' => 'Workflow2_OAuthHTTPHandler_Handler',
'handler_function' => 'handle',
'handler_data' => array()
);
$uid = \Vtiger_ShortURL_Helper::generate($options);
$trackURL = rtrim(vglobal('site_URL'), '/') . "/shorturl.php?id=" . $uid;
$content = VtUtils::getContentFromUrl(OAUTH_CALLBACK_ADD, array(
'url' => $trackURL,
'provider' => $service_provider,
), 'post');
$adb = \PearDatabase::getInstance();
$sql = 'UPDATE vtiger_shorturls SET handler_data = ? WHERE uid = ?';
$adb->pquery($sql, array(VtUtils::json_encode(array(
'oauth_id' => $data['id'],
'callback' => $content,
)), $uid));
$sql = 'UPDATE ' . self::$tablename . ' SET provider = ? WHERE id = ?';
$adb->pquery($sql, array($service_provider, $data['id']));
return $content;
}
public function callHandler($method, $params = array()) {
//VtUtils::enableComposer();
$data = $this->getData();
array_unshift($params, $method);
array_unshift($params, $this);
return call_user_func_array($data['handler'], $params);
}
public function getData() {
if($this->_data !== null) {
return $this->_data;
}
$adb = \PearDatabase::getInstance();
$sql = 'SELECT * FROM '.self::$tablename.' WHERE name = ? OR hash = ?';
$result = $adb->pquery($sql, array($this->_key, $this->_key), true);
$this->_data = $adb->fetchByAssoc($result);
return $this->_data;
}
}