Files
crm.clientright.ru/modules/Settings/ExtensionStore/connectors/ExtnStore.php
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

502 lines
16 KiB
PHP

<?php
/* +**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
* ***********************************************************************************/
include_once dirname(__FILE__).'/../libraries/NetClient.php';
class Settings_ExtensionStore_ExtnStore_Connector {
protected $url;
protected $auth;
protected $user_table = 'vtiger_extnstore_users';
protected $identifier_name = 'extnstore';
protected function __construct($url) {
$this->url = $url;
}
/**
* Function to get connector instance either pro or free version
* @staticvar null $singletons
* @param type $url
* @return \self
*/
public static function getInstance($url) {
static $singletons = null;
if ($singletons === null) {
$singletons = array();
}
if (!isset($singletons[$url])) {
$singletons[$url] = new self($url);
}
return $singletons[$url];
}
/**
* Function to intialize basic auth based on data in database or session
* @global type $currentModule
* @return auth
* @throws Exception
*/
protected function initializeAuth() {
$db = PearDatabase::getInstance();
if (!$this->auth) {
// Quick way to check if entry exists and pull 1st undeleted is
// to pull only one record by the order on deleted column and
// evaluating at-least one row exists.
$authResult = $db->pquery('SELECT * FROM '.$this->user_table.' ORDER BY deleted LIMIT 1', array());
if ($db->num_rows($authResult)) {
$this->auth = $db->fetch_array($authResult);
if ($this->auth['deleted'] == 1)
$this->auth = null;
}
if (empty($this->auth['password']))
$this->auth['password'] = isset($_SESSION[$this->identifier_name.'_password']) ? $_SESSION[$this->identifier_name.'_password'] : null;
if (empty($this->auth['username']))
$this->auth['username'] = isset($_SESSION[$this->identifier_name.'_username']) ? $_SESSION[$this->identifier_name.'_username'] : null;
if (empty($this->auth['password']) && (empty($this->auth['username']))) {
throw new Exception(vtranslate('LBL_USERNAME_AND_PASSWORD_REQUIRED_FOR_AUTHENTICATION'));
}
}
return $this->auth;
}
/**
* Function to perform client request to get response
* @param type $uri
* @param type $method
* @param type $params
* @param type $auth
* @return json response
* @throws Exception
*/
protected function api($uri, $method, $params, $auth) {
if ($auth) {
try {
$this->initializeAuth();
} catch (Exception $ex) {
return array('success' => 'false', 'error' => $ex->getMessage());
}
}
$fn = ($method == "GET" || $method == "DLD") ? "doGet" : "doPost";
if ($method == "PUT")
$fn = "doPut";
$client = $this->getNetClientInstance($method, $uri);
if ($auth && $this->auth) {
$authParams = $this->prepareAuthParams($this->auth['username'], $this->auth['password']);
$client->setAuthorization($authParams['username'], $authParams['password']);
}
global $application_unique_key;
if (!$params) $params = array();
if (!isset($params['uid'])) $params['uid'] = $application_unique_key;
$content = $client->$fn($params);
$response = $content['response'];
$status = $content['status'];
if (($status != 200)) {
throw new Exception(isset($content['errorMessage']) ? $content['errorMessage'] : $response);
}
if ($method == "DLD") {
return $response;
} else {
$json = Zend_Json::decode($response);
if ($json) {
if ($json['success']) {
return $json['result'];
} else {
throw new Exception($json['error']['message']);
}
}
}
return null;
}
/**
* Function to get net client instance for free version
* @param type $method
* @param type $uri
* @return \Settings_ExtensionStore_NetClient
*/
protected function getNetClientInstance($method, $uri) {
$clientInstance = new Settings_ExtensionStore_NetClient($method == "DLD" ? $uri : ($this->url.$uri));
return $clientInstance;
}
/**
* Function to generate suth params for free version
* @param type $username
* @param type $password
* @return type array
*/
protected function prepareAuthParams($username, $password) {
return array('username' => $username,
'password' => urlencode(Zend_Json::encode(array('password' => $password))));
}
/**
* Function to get session identifier name
* @return type string
*/
public function getSessionIdentifier() {
return $this->identifier_name;
}
/**
* Function to get extension table name
* @return type string
*/
public function getExtensionTable() {
return $this->user_table;
}
/**
* Function to get max created on for promotions
*/
public function getMaxCreatedOn($type = 'Extension', $function, $field) {
$q = array('type' => $type);
try {
$response = $this->api('/app/listings', 'GET', $q ? array('q' => Zend_Json::encode($q), 'fn' => $function, 'max' => $field) : null, false);
return array('success' => true, 'response' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to get basic listings based on type of listing
* @param type $id
* @param type $type
* @return type json reponse
*/
public function getListings($id = null, $type = 'Extension') {
global $vtiger_current_version;
$q = array('type' => $type, 'vv'=> $vtiger_current_version);
if ($id) {
$q['id'] = $id;
}
try {
$response = $this->api('/app/listings', 'GET', $q ? array('q' => Zend_Json::encode($q)) : null, false);
return array('success' => true, 'response' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to get specified listing based on type of listing
* @param type $term
* @param type $type
* @return type json response
*/
public function findListings($term = null, $type = 'Extension') {
$q = array('term' => $term, 'type' => $type);
try {
$response = $this->api('/app/searchlistings', 'GET', array('q' => Zend_Json::encode($q)), false);
return array('success' => true, 'response' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to download listing
* @param type $downloadurl
* @return type
*/
public function download($downloadurl) {
try {
$response = $this->api($downloadurl, 'DLD', null, true);
return array('success' => true, 'response' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to get customer reviews of listing
* @param type $extensionId
* @return type json response
*/
public function getCustomerReviews($extensionId) {
$q = $extensionId ? array('listing' => $extensionId) : null;
try {
return $this->api('/app/reviews', 'GET', $q ? array('q' => Zend_Json::encode($q)) : null, false);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to get author information of listing
* @param type $extensionId
* @return type json response
*/
public function getListingAuthor($extensionId) {
$q = $extensionId ? array('listing' => $extensionId) : null;
try {
return $this->api('/app/listingauthor', 'GET', $q ? array('q' => Zend_Json::encode($q)) : null, false);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to post review for listing
* @param type $listing
* @param type $comment
* @param type $rating
* @return type json response
*/
public function postReview($listing, $comment, $rating) {
$listing = $listing ? array('listing' => $listing) : null;
$comment = $comment ? array('comment' => $comment, 'rating' => $rating) : null;
try {
$response = $this->api('/customer/reviews', 'POST', $listing ? array('q' => Zend_Json::encode($listing), 'review' => Zend_Json::encode($comment)) : null, true);
return array('success' => true, 'result' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to get screen shots of listing
* @param type $extensionId
* @return type json response
*/
public function getScreenShots($extensionId) {
$q = $extensionId ? array('listing' => $extensionId) : null;
try {
return $this->api('/app/listingscreenshots', 'GET', $q ? array('q' => Zend_Json::encode($q)) : null, false);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to verify purchase of extension
* @param $listingName => extension name to verify purchase
*/
public function verifyPurchase($listingName) {
$q = $listingName ? array('identifier' => $listingName) : null;
try {
return $this->api('/customer/mysubscriptions', 'GET', $q ? array('type' => 'verifypurchase', 'q' => Zend_Json::encode($q)) : null, true);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to retrieve profile of loged in user
* @return type
*/
public function getProfile() {
try {
return $this->api('/customer/profile', 'GET', '', true);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to create card details for logged in user in pro version
* @param type $number
* @param type $expmonth
* @param type $expyear
* @param type $cvc
* @return type json response
*/
public function createCard($number, $expmonth, $expyear, $cvc) {
$cardDetails = array('number' => $number, 'expmonth' => $expmonth, 'expyear' => $expyear, 'cvc' => $cvc);
try {
$response = $this->api('/customer/card', 'POST', $cardDetails, true);
return array('success' => true, 'result' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to update card details for logged in user
* @param type $number
* @param type $expmonth
* @param type $expyear
* @param type $cvc
* @param type $customerId
* @return type json response
*/
public function updateCard($number, $expmonth, $expyear, $cvc, $customerId) {
$cardDetails = array('number' => $number, 'expmonth' => $expmonth, 'expyear' => $expyear, 'cvc' => $cvc, 'id' => $customerId);
try {
$response = $this->api('/customer/card', 'PUT', $cardDetails, true);
return array('success' => true, 'result' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to get Customer Card Details
* @param array $cardId
* @return type array
*/
public function getCardDetails($cardId) {
$cardId = array('id' => $cardId);
try {
return $this->api('/customer/card', 'GET', $cardId, true);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to signup for marketplace
* @param type $username
* @param type $password
* @param type $confirmPassword
* @param type $firstName
* @param type $lastName
* @param type $companyName
* @return type json result
*/
public function signUp($username, $password, $confirmPassword, $firstName, $lastName, $companyName) {
$signupParams = $this->prepareSignUpParams($username, $password, $confirmPassword, $firstName, $lastName, $companyName);
try {
$this->auth = $this->api('/app/customer', 'POST', $signupParams, false);
if ($this->auth) {
$this->persistLogin($this->auth['email'], md5($this->auth['password']), false);
}
return array('success' => true, 'result' => $this->auth);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
/**
* Function to prepare signup params for signup operation
* @param type $username
* @param type $password
* @param type $confirmPassword
* @param type $firstName
* @param type $lastName
* @param type $companyName
* @return type array
*/
protected function prepareSignUpParams($username, $password, $confirmPassword, $firstName, $lastName, $companyName) {
return array('email' => $username,
'password' => $password,
'confirmPassword' => $confirmPassword,
'firstname' => $firstName,
'lastname' => $lastName,
'company' => $companyName);
}
/**
* Function to retrieve persistence status of login
* @return boolean
*/
protected function getPersistenceStatus() {
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT 1 FROM '.$this->user_table, array());
if ($db->num_rows($result)) {
return true;
}
return false;
}
/**
* Function to persist login based on status of $persistLogin
* @param type $userName
* @param type $password
* @param type $persistLogin
*/
protected function persistLogin($userName, $password, $rememberPassword) {
$db = PearDatabase::getInstance();
if ($rememberPassword) {
$db->pquery('DELETE FROM '.$this->user_table, array());
$db->pquery('INSERT INTO '.$this->user_table.'(username,password, createdon) VALUES(?,?,?)', array($userName, $password, date('Y-m-d H:i:s')));
} else {
$persistanceStatus = $this->getPersistenceStatus();
if (!$persistanceStatus) {
$db->pquery('INSERT INTO '.$this->user_table.' (username, createdon) VALUES(?,?)', array($userName, date('Y-m-d H:i:s')));
}
$_SESSION[$this->identifier_name.'_username'] = $userName;
$_SESSION[$this->identifier_name.'_password'] = $password;
}
}
/**
* Function to login to market place and persist data based on $persistLogin
* @param type $userName
* @param type $password
* @param type $persistLogin
* @return type
*/
public function login($userName, $password, $persistLogin) {
try {
/** set user entered password to session as we are using to set auth
* header initializeAuth() function which we are depending on session
* password if password not exists in db
**/
$_SESSION[$this->identifier_name.'_username'] = $userName;
$_SESSION[$this->identifier_name.'_password'] = $password;
$this->auth = $this->api('/customer/profile', 'GET', '', true);
if ($this->auth) {
$this->persistLogin($this->auth['email'], $this->auth['password'], $persistLogin);
}
return array('success' => true, 'result' => $this->auth);
} catch (Exception $ex) {
//Should flush credentials from session if login fails
$_SESSION[$this->identifier_name.'_username'] = null;
$_SESSION[$this->identifier_name.'_password'] = null;
$exceptionMessage = $ex->getMessage();
if (empty($exceptionMessage)) {
$error = vtranslate('LBL_UNAUTHORIZED', 'Settings:ExtensionStore');
} else {
$error = $exceptionMessage;
}
return array('success' => false, 'error' => $error);
}
}
public function getCustomerDetails($customerId) {
try {
$response = $this->api("/app/customer?id=$customerId", 'GET', '', true);
return array('success' => true, 'result' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
public function getNews() {
try {
$response = $this->api("/app/news", 'GET', '', false);
return array('success' => true, 'result' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
public function forgotPassword($emailAddress) {
$params = array('email' => $emailAddress);
try {
$response = $this->api('/app/forgotpassword', 'POST', $params, false);
return array('success' => true, 'result' => $response);
} catch (Exception $ex) {
return array('success' => false, 'error' => $ex->getMessage());
}
}
}