晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/pkg/vtiger/modules/ExtensionStore/settings/models/ |
Upload File : |
<?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.
* ***********************************************************************************/
vimport('~~/vtlib/Vtiger/Package.php');
vimport('~/libraries/PHPMarkdown/Michelf/Markdown.inc.php');
class Settings_ExtensionStore_Extension_Model extends Vtiger_Base_Model {
private static $EXTENSION_MANAGER_URL = false;
protected $EXTENSIONSTORE_LOOKUP_URL = null;
protected $siteURL = null;
var $fileName;
public function __construct() {
parent::__construct();
$this->EXTENSIONSTORE_LOOKUP_URL = 'https://marketplace.vtiger.com/api';
global $site_URL;
if (empty($site_URL)) {
throw new Exception('Invalid configuration.');
}
$this->siteURL = $site_URL;
}
public function getExtensionsLookUpUrl() {
return $this->EXTENSIONSTORE_LOOKUP_URL;
}
public function getExtensionsManagerUrl() {
return self::$EXTENSION_MANAGER_URL ? self::$EXTENSION_MANAGER_URL : $this->EXTENSIONSTORE_LOOKUP_URL;
}
/**
* Function to set id for this instance
* @param <Integer> $extensionId
* @return <type>
*/
public function setId($extensionId) {
$this->set('id', $extensionId);
return $this;
}
/**
* Function to set file name for this instance
* @param <type> $fileName
* @return <type>
*/
public function setFileName($fileName) {
$this->fileName = $fileName;
return $this;
}
/**
* Function to get Id of this instance
* @return <Integer> id
*/
public function getId() {
return $this->get('id');
}
/**
* Function to get name of this instance
* @return <String> module name
*/
public function getName() {
return $this->get('name');
}
/**
* Function to get file name of this instance
* @return <String> file name
*/
public function getFileName() {
return $this->fileName;
}
public function getDescription() {
return $this->description;
}
/**
* Function to store the details of tracking
* @return <boolean> true/false
*/
public function installTrackDetails() {
return true;
}
/**
* Function to get package of this instance
* @return <Vtiger_Package> package object
*/
public function getPackage() {
$packageModel = new Vtiger_Package();
$moduleName = $packageModel->getModuleNameFromZip(self::getUploadDirectory().'/'.$this->getFileName());
if ($moduleName) {
return $packageModel;
}
return false;
}
/**
* Function to check whether it is compatible with vtiger or not
* @return <boolean> true/false
*/
public function isVtigerCompatible() {
vimport('~~/vtlib/Vtiger/Version.php');
$vtigerVersion = $this->get('vtigerVersion');
$vtigerMaxVersion = $this->get('vtigerMaxVersion');
if ((Vtiger_Version::check($vtigerVersion, '>=') && $vtigerMaxVersion && Vtiger_Version::check($vtigerMaxVersion, '<')) || Vtiger_Version::check($vtigerVersion, '=')) {
return true;
}
return false;
}
/**
* Function to check whether the module is already exists or not
* @return <true/false>
*/
public function isAlreadyExists() {
$moduleName = $this->getName();
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
if ($moduleModel) {
return true;
} else if (self::getLanguageInstance($moduleName)) {
return true;
}
return false;
}
public static function getLanguageInstance($lang) {
$sql = 'SELECT id,name,prefix FROM vtiger_language WHERE name = ? OR prefix = ?';
$db = PearDatabase::getInstance();
$result = $db->pquery($sql, array($lang, $lang));
if ($db->num_rows($result) > 0) {
$instance = new self();
$row = $db->query_result_rowdata($result, 0);
$instance->setData($row);
return $instance;
} else {
return false;
}
}
/**
* Function to check whether the module is upgradable or not
* @return <type>
*/
public function isUpgradable() {
$moduleName = $this->getName();
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
if ($moduleModel) {
if ($moduleModel->get('version') < $this->get('pkgVersion')) {
return true;
}
}
return false;
}
/**
* Function to get instance by using id
* @param <Integer> $extensionId
* @param <String> $fileName
* @return <Settings_ExtensionStore_Extension_Model> $extension Model
*/
public function getInstanceById($extensionId, $trial = false, $fileName = false) {
$uploadDir = self::getUploadDirectory();
if ($fileName) {
if (is_dir($uploadDir)) {
$uploadFileName = "$uploadDir/$fileName";
checkFileAccess(self::getUploadDirectory());
$extensionModel = new self();
$extensionModel->setId($extensionId)->setFileName($fileName);
return $extensionModel;
}
} else {
if (!is_dir($uploadDir)) {
mkdir($uploadDir);
}
$uploadFile = 'usermodule_'.time().'.zip';
$uploadFileName = "$uploadDir/$uploadFile";
checkFileAccess(self::getUploadDirectory());
$response = $this->download($extensionId, $trial, $uploadFileName);
if ($response['success']) {
$extensionModel = new self();
$extensionModel->setId($extensionId)->setFileName($uploadFile);
return array('success' => true, 'result' => $extensionModel);
} else {
return array('success' => false, 'message' => $response['message']);
}
}
return false;
}
/**
* Function to get max created on promotion
*/
public function getMaxCreatedOn($type = 'Extension', $function, $field) {
$connector = $this->getConnector();
if ($connector) {
$listings = $connector->getMaxCreatedOn($type, $function, $field);
return $listings;
}
}
public function getNews() {
$news = array();
$connector = $this->getConnector();
if ($connector) {
$news = $connector->getNews();
}
return $news;
}
/**
* Function to get all availible extensions
* @param <Object> $xmlContent
* @return <Array> list of extensions <Settings_ExtensionStore_Extension_Model>
*/
public function getListings($id = null, $type = 'Extension') {
$extensionModelsList = array();
$connector = $this->getConnector();
if ($connector) {
$listings = $connector->getListings($id, $type);
if ($listings['success']) {
$listings = $listings['response'];
if (!is_array($listings))
$listings = array($listings);
foreach ($listings as $listing) {
$extensionModelsList[(string) $listing['id']] = $this->getInstanceFromArray($listing);
}
} else {
return array('success' => false, 'message' => $listings['error']);
}
}
return $extensionModelsList;
}
/**
* Function to get listings of extension id
*/
public function getExtensionListings($extensionId) {
$extensionModelsList = array();
$connector = $this->getConnector();
if ($connector) {
$listings = $connector->getListings($extensionId);
if ($listings['success']) {
$listing = $listings['response'];
$extensionModelsList[(string) $listing['id']] = $this->getInstanceFromArray($listing);
return $extensionModelsList;
} else {
return array('success' => false, 'message' => $listings['error']);
}
}
}
/**
* Function to download the file of this instance
* @param <Integer> $extensionId
* @param <String> $targetFileName
* @return <boolean> true/false
*/
public function download($extensionId, $trial, $targetFileName) {
$extensions = $this->getExtensionListings($extensionId);
$downloadURL = $extensions[$extensionId]->get('downloadURL');
if ($trial) {
$downloadURL = $downloadURL.'&mode=Trial';
}
if ($downloadURL) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->download($downloadURL);
if ($response['success']) {
file_put_contents($targetFileName, $response['response']);
return array('success' => true);
} else {
return array('success' => false, 'message' => $response['error']);
}
}
}
return false;
}
/**
* Function to get extensions based on search
* @param <String> search term
* @return <Array> list of extensions <Settings_ExtensionStore_Extension_Model>
*/
public function findListings($searchTerm = null, $searchType) {
$extensionModelsList = array();
$connector = $this->getConnector();
if ($connector) {
$listings = $connector->findListings($searchTerm, $searchType);
if ($listings['success']) {
$listings = $listings['response'];
if (!is_array($listings))
$listings = array($listings);
foreach ($listings as $listing) {
$extensionModelsList[(string) $listing['id']] = $this->getInstanceFromArray($listing);
}
} else {
return array('success' => false, 'message' => $listings['error']);
}
}
return $extensionModelsList;
}
public function getExtensionTable() {
$connector = $this->getConnector();
if ($connector) {
$tableName = $connector->getExtensionTable();
}
return $tableName;
}
/**
* Function to get registration status of user
*/
public function checkRegistration() {
$tableName = $this->getExtensionTable();
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT 1 FROM '.$tableName, array());
if ($db->num_rows($result)) {
return true;
}
return false;
}
public function getSessionIdentifier() {
$connector = $this->getConnector();
if ($connector) {
return $connector->getSessionIdentifier();
}
}
/**
* Function to get password status of extension store
*/
public function passwordStatus() {
$tableName = $this->getExtensionTable();
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT password FROM '.$tableName, array());
if ($db->query_result($result, 0, 'password')) {
return true;
}
return false;
}
/**
* Function to registered user name for market place
*/
public function getRegisteredUser() {
$tableName = $this->getExtensionTable();
$db = PearDatabase::getInstance();
$result = $db->pquery('SELECT username FROM '.$tableName, array());
$userName = $db->query_result($result, 0, 'username');
if (strlen($userName)) {
return $userName;
}
return false;
}
/**
* Function to register user for extension store
*/
public function signup($options) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->signUp($options['emailAddress'], $options['password'], $options['confirmPassword'], $options['firstName'], $options['lastName'], $options['companyName']);
return $response;
}
}
/**
* Function to Logout from extension store
*/
public function logoutMarketPlace(Vtiger_Request $request) {
$sql = 'DELETE FROM vtiger_extnstore_users';
$db = PearDatabase::getInstance();
$db->pquery($sql, array());
}
/**
* Function to login user to extension store
*/
public function login($options) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->login($options['emailAddress'], $options['password'], $options['savePassword']);
return $response;
}
}
/**
* Funstion to get customer reviews based on extension id
*/
public function getCustomerReviews($extensionId) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->getCustomerReviews($extensionId);
return $response;
}
}
/**
* Function to post customer reviews
*/
public function postReview($listing, $comment, $rating) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->postReview($listing, $comment, $rating);
return $response;
}
}
/**
* Function to get screen shots of given extension
*/
public function getScreenShots($extensionId) {
$screenShotListings = array();
$connector = $this->getConnector();
if ($connector) {
$listings = $connector->getScreenShots($extensionId);
foreach ($listings as $listing) {
$screenShotListings[(string) $listing['id']] = $this->getInstanceFromScreenShotArray($listing);
}
return $screenShotListings;
}
}
/**
* Function to verify extension purchase
*/
public function verifyPurchase($listingName) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->verifyPurchase($listingName);
if ($response == 1) {
return true;
}
return false;
}
}
/**
* Function to get listing author information
*/
public function getListingAuthor($extensionId) {
$connector = $this->getConnector();
if ($connector) {
$authorInfo = $connector->getListingAuthor($extensionId);
return $authorInfo;
}
}
/**
* Function to get customer profile details
*/
public function getProfile() {
$connector = $this->getConnector();
if ($connector) {
$customerInfo = $connector->getProfile();
return $customerInfo;
}
}
/**
* Function to get instance by using XML node
* @param <XML DOM> $extensionXMLNode
* @return <Settings_ExtensionStore_Extension_Model> $extensionModel
*/
public function getInstanceFromArray($listing) {
$extensionModel = new self();
foreach ($listing as $key => $value) {
switch ($key) {
case 'name' : $key = 'label'; break;
case 'identifier' : $key = 'name'; break;
case 'version' : $key = 'pkgVersion'; break;
case 'minrange' : $key = 'vtigerVersion'; break;
case 'maxrange' : $key = 'vtigerMaxVersion'; break;
case 'CustomerId' : $key = 'publisher'; break;
case 'approvedon' : $key = 'pubDate'; break;
case 'price' : if (!$value) {
$value = 'Free';
}
break;
case 'ListingFileId': if ($value) {
$key = 'downloadURL';
$value = $this->getExtensionsLookUpUrl().'/customer/listingfiles?id='.$value;
}
break;
case 'thumbnail' : if ($value) {
$key = 'thumbnailURL';
$value = str_replace('api', "_listingimages/$value", $this->getExtensionsLookUpUrl());
}
break;
case 'banner' : if ($value) {
$key = 'bannerURL';
$value = str_replace('api', "_listingimages/$value", $this->getExtensionsLookUpUrl());
}
break;
case 'description' : if ($value) {
$markDownInstance = new Michelf\Markdown();
$value = $markDownInstance->transform($value);
}
}
$extensionModel->set($key, $value);
}
$label = $extensionModel->get('label');
if (!$label) {
$extensionModel->set('label', $extensionModel->getName());
}
$moduleModel = self::getModuleFromExtnName($extensionModel->getName());
if ($moduleModel && $moduleModel->get('extnType') == 'language') {
$trial = $extensionModel->get('trial');
$moduleModel->set('trial', $trial);
}
$extensionModel->set('moduleModel', $moduleModel);
return $extensionModel;
}
public static function getModuleFromExtnName($extnName) {
$moduleModel = Vtiger_Module_Model::getInstance($extnName);
if ($moduleModel) {
$moduleModel->set('extnType', 'module');
}
if (!$moduleModel) {
if (self::getLanguageInstance($extnName)) {
$moduleModel = new Vtiger_Module_Model();
$moduleModel->set('name', $extnName);
$moduleModel->set('isentitytype', false);
$moduleModel->set('extnType', 'language');
}
}
return $moduleModel;
}
/**
* Function to get instance by using XML node
* @param <XML DOM> $extensionXMLNode
* @return <Settings_ExtensionStore_Extension_Model> $extensionModel
*/
public function getInstanceFromScreenShotArray($listing) {
$extensionModel = new self();
foreach ($listing as $key => $value) {
switch ($key) {
case 'location':
if ($value) {
$key = 'screenShotURL';
$value = str_replace('api', "_listingimages/$value", $this->getExtensionsLookUpUrl());
}
break;
}
$extensionModel->set($key, $value);
}
return $extensionModel;
}
public function getCustomerDetails($customerId) {
$connector = $this->getConnector();
if ($connector) {
$customerInfo = $connector->getCustomerDetails($customerId);
return $customerInfo;
}
}
/**
* Function to insert card details of registered user
*/
public function createCard($number, $expmonth, $expyear, $cvc) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->createCard($number, $expmonth, $expyear, $cvc);
return $response;
}
}
/**
* Function to update card details of registered user
*/
public function updateCard($number, $expmonth, $expyear, $cvc, $customerId) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->updateCard($number, $expmonth, $expyear, $cvc, $customerId);
return $response;
}
}
/**
* Function to get card details of customer
*/
public function getCardDetails($cardId) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->getCardDetails($cardId);
return $response;
}
}
public static function getInstance() {
return new self();
}
public static function getUploadDirectory($isChild = false) {
$uploadDir .= 'test/vtlib';
if ($isChild) {
$uploadDir = '../'.$uploadDir;
}
return $uploadDir;
}
public function getLocationUrl($extensionId, $extensionName) {
global $current_user;
if (is_admin($current_user)) {
return 'index.php?module=ExtensionStore&parent=Settings&view=ExtensionStore&mode=detail&extensionId='.$extensionId.'&extensionName='.$extensionName;
} else {
return 'https://marketplace.vtiger.com/app/listings?id='.$extensionId;
}
}
public function forgotPassword($options) {
$emailAddress = $options['emailAddress'];
if (filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
$connector = $this->getConnector();
if ($connector) {
$response = $connector->forgotPassword($emailAddress);
return $response;
}
}
return array('success' => false, 'error' => 'Invalid EmailAddress!');
}
public function getConnector() {
$connector = null;
$url = $this->getExtensionsLookUpUrl();
if ($url) {
$connector = Settings_ExtensionStore_ExtnStore_Connector::getInstance($url);
}
return $connector;
}
}